2017-03-05 69 views
3

在我的程序中,我有2个列表视图和1个按钮。 当我按下按钮时,第一个列表视图中的每个列表视图项目都将在第二个列表视图中被选中(并且该项目始终存在于第二个列表视图中)。c#如果两个列表视图包含它,请选择listview项目

我在选择项目时遇到问题,因为第一个和第二个listview中的索引不是相同的项目。所以我试图用IndexOf得到索引。

foreach (ListViewItem item in firstListView.Items) 
{ 
    int index = secondListView.Items.IndexOf(item); 
    secondListView.Items[index].Selected = true; 
    secondListView.Select(); 
} 

我总是得到一个错误,index-1当我点击按钮。我不明白我做错了什么。

编辑:

的列表视图具有8列。第一列文本通常为0 而我只能使用IndexOf作为第一列。但我想检查所有列。我已经找到了一个很好的解决方案。

感谢大家谁试图帮助。

+0

当debbuging什么行导致错误? – Whencesoever

+0

'secondListView.Items [index] .Selected = true;'它表示值'-1'无效 – Latif

+0

*我已经找到了一个很好的解决方案... *所以你可以添加你自己的答案,如果它比现有的更好答案。 –

回答

1

可以使用这样的LINQ查询,选择存在于第一个列表太第二列表的项目:

var items = from i1 in listView1.Items.Cast<ListViewItem>() 
      from i2 in listView2.Items.Cast<ListViewItem>() 
      where i1.SubItems.Cast<ListViewItem.ListViewSubItem>() 
        .Where((s, i) => s.Text != i2.SubItems[i].Text).Count() == 0 
      select i2; 
items.ToList().ForEach(x => { x.Selected = true; }); 

注: 当尝试使用secondListView.Items.IndexOf方法找到属于一个项目到firstListView你不能指望它找到该项目。您尝试查找其索引的项目不存在于第二个listview的项目集合中。您应该使用项目和子项目的Text属性来查找项目。

+0

'Text'属性只获取该行第一列的文本。我需要检查整行,因为一些信息可能是相同的。所以'IndexOf'永远不会工作。现在我知道了。 – Latif

+0

然后你需要一个更好的标准'where'。查看编辑。 –

0

如果IndexOf在列表中找不到传递给它的对象,则返回-1。我的猜测是你的平等比较存在问题。列表中的对象是否实现了IComparable?否则,他们可能不会正确地找到这些项目,并且正在恢复到错误的平等比较。 ListViewItem可能不会比较你的期望。

1

那么同样的项目显然不能存在于两个不同的列表中。

如果文字是一样的,那么尝试寻找通过它:

foreach (ListViewItem listViewItem in l1.Items) 
{ 
    var item = l2.Items.Cast<ListViewItem>().Where(lvi => lvi.Text == listViewItem.Text); 
    item.Selected=true; 
} 

或者:

foreach (ListViewItem listViewItem in l2.Items.Cast<ListViewItem>() 
    .Where(lvi => l1.Items.Cast<ListViewItem>().Any(lvi2 => lvi.Text == lvi2.Text)) 
{ 
    listVieItem.Selected=true; 
} 
0

,你可以尝试通过查找文本中的项目,然后得到这样

指数
foreach (ListViewItem item in firstListView.Items) 
     { 

      var itm = secondListView.FindItemWithText(item.Text); 
      int index = secondListView.Items.IndexOf(itm); 
      secondListView.Items[index].Selected = true; 
      secondListView.Select(); 
     } 

什么FindItemWithText会做的是得到在secondListView这将是相同的名称firstListViewIndexOf将获得项目的索引中secondListView

编辑

这个解决方案是好的,当你有两个列表,其项目是相同的,不包括在名称否则,如果你的任何重复secondListView中有两个项目FindItemWithText只会得到第一个项目。

+0

有一个小问题,因为'FindItemWithText'会找到第一个以searchString开头的项目。所以,如果第一个项目是'item100',并且他正在寻找'item1',它会发现'item100' –

相关问题