0

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

我的问题是我有一个函数,它通过 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

4 回答 4

1

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

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

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

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

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

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

这里了解更多信息Cast

于 2013-03-19T18:29:32.217 回答
0

在文档中,它说它们是类型ListViewItemCollection

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

于 2013-03-19T18:24:27.020 回答