0

タイトルが申し訳ありませんが、私の問題を伝えるためのより説明的/簡潔な方法は考えられませんでした。

私の問題は、foreach ループを介して ListViewItems のコレクションを操作する関数があり、それが操作する項目のリストは、関数へのブール値パラメーターに依存し、それをbSelectedと呼ぶことです。

これが true の場合は、リスト ビューから SelectedItems を使用します。それ以外の場合は、リスト ビューの Items を使用します。

アイテムのリストを表すこのオブジェクトがどうあるべきか、またはそれを取得する方法を判断するのに苦労しています。私はいくつかの異なるアプローチを試しました( ListView はlvListと呼ばれることに注意してください):

IList<ListViewItem> listItems = 
  ( bSelected ? (IList<ListViewItem>)lvList.SelectedItems 
              : (IList<ListViewItem>)lvList.Items );
foreach ( ListViewItem lvi in listItems ) { ... }

IEnumerator<ListViewItem> listEnumerator = 
  ( bSelected ? (IEnumerator<ListViewItem>)lvList.SelectedItems.GetEnumerator() 
              : (IEnumerator<ListViewItem>)lvList.Items.GetEnumerator() );
while ( listEnumerator.MoveNext() ) { ... }

同様の同類の他のソリューションを試しましたが、SelectedItems に適用される型変換に関係する実行時エラーが発生します。

foreach ループを一方のリストまたは他方のリストで直接使用すると、次のように動作するため、方法が必要であることはわかっています。

foreach ( ListViewItem lvi in lvList.SelectedItems ) { ... }

foreach ( ListViewItem lvi in lvList.Items ) { ... }

私は C# の経験があまりないので、助けていただければ幸いです。

4

4 に答える 4

1

次のように、強く型付けされたリストにすることができます。

List<ListViewItem> listItems = 
  ( bSelected ? lvList.SelectedItems.Cast<ListViewItem>().ToList()
              : lvList.Items.Cast<ListViewItem>().ToList() );

詳細はこちらCast

于 2013-03-19T18:29:32.217 に答える
1

型なし型なし IEnumerable を使用してみてください。

IEnumerable listEnumerable = 
  ( bSelected ? lvList.SelectedItems 
              : lvList.Items);
foreach ( ListViewItem lvi in listEnumerable ) { ... }
于 2013-03-19T18:26:07.430 に答える
1

どちらも IList を実装しているため、IList を使用できます。次のことを試してください。

IList listItems = 
  ( bSelected ? (IList)lvList.SelectedItems 
              : (IList)lvList.Items );
foreach ( ListViewItem lvi in listItems ) { ... }
于 2013-03-19T18:27:21.287 に答える
0

ドキュメントでは、それらは次のタイプであると書かれていますListViewItemCollection

http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.items.aspx

于 2013-03-19T18:24:27.020 に答える