【问题标题】:c# select listview item if two listviews contains itc# 如果两个列表视图包含它,则选择列表视图项目
【发布时间】:2017-03-05 11:39:48
【问题描述】:

在我的程序中,我有 2 个列表视图和 1 个按钮。 当我按下按钮时,第一个列表视图中的每个列表视图项都将在第二个列表视图中被选中(并且该项目始终存在于第二个列表视图中)。

我在选择项目时遇到问题,因为第一个和第二个列表视图中的索引不是相同的项目。所以我正在尝试使用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。但我想检查所有列。我已经找到了一个很好的解决方案。

感谢所有尝试提供帮助的人。

【问题讨论】:

  • 以及调试时哪一行导致错误?
  • secondListView.Items[index].Selected = true; 它说值 @​​987654328@ 无效
  • 我已经找到了一个很好的解决方案......因此,如果它比现有答案更好,您可以添加自己的答案。
  • 我不是这个意思。但我让你的答案是最好的,因为你给了我灵感。

标签: c# .net winforms listview


【解决方案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 的项目时,您不能指望它找到该项目。您尝试查找其索引的项目在第二个列表视图的项目集合中不存在。您应该使用项目和子项目的Text 属性找到项目。

【讨论】:

  • Text 属性只获取该行第一列的文本。我需要检查整行,因为有些信息可能是相同的。所以IndexOf 永远不会工作。现在我知道了。
  • 那么您需要一个更好的where 标准。查看编辑。
【解决方案2】:

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

如果文字相同,请尝试查找:

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;
}

【讨论】:

    【解决方案3】:

    IndexOf 如果在列表中找不到传递给它的对象,则返回 -1。我的猜测是你的平等比较有问题。列表中的对象是否实现了 IComparable?否则,他们可能无法正确找到项目并恢复到糟糕的相等比较。 ListViewItem 可能与您的预期不同。

    【讨论】:

      【解决方案4】:

      您可以尝试通过文本查找项目,然后像这样获取索引

         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 中的项目,该项目将与 firstListView 中的名称相同,IndexOf 将获取 secondListView 中的项目索引

      编辑

      当您有两个项目相同且名称不包含任何重复的列表时,此解决方案很好,否则如果您在 secondListView 中有两个项目名称相同 FindItemWithText 将只获得第一个项目。

      【讨论】:

      • 这有一个小问题,因为FindItemWithText 会找到以searchString 开头的第一个项目。所以,如果第一项是item100,并且他正在寻找item1,它将找到item100
      猜你喜欢
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      • 2012-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多