ListViewItems的通用列表

时间:2013-03-19 18:20:56

标签: c# listviewitem

对不起标题,我想不出更具描述性/简洁性的方式来传达我的问题。

我的问题是我有一个函数通过foreach循环对ListViewItems的集合进行操作,它将操作的项目列表取决于函数的布尔参数,称之为 bSelected

如果是这样,我想使用列表视图中的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 个答案:

答案 0 :(得分:1)

尝试使用无类型的无类型IEnumerable:

IEnumerable listEnumerable = 
  ( bSelected ? lvList.SelectedItems 
              : lvList.Items);
foreach ( ListViewItem lvi in listEnumerable ) { ... }

答案 1 :(得分:1)

您可以使用IList,因为它们都实现了它。请尝试以下方法:

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

答案 2 :(得分:1)

您可以强制它成为强类型列表,如下所示:

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

转到here了解有关Cast

的更多信息

答案 3 :(得分:0)

在文档中,它表示类型为ListViewItemCollection

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