【问题标题】:Doing a multi-column search for an item in a listView control using c#使用c#在listView控件中进行多列搜索
【发布时间】:2015-06-09 08:10:42
【问题描述】:

我在 Visual Studio 2013 中使用多列 listView 控件并使用 C# 进行编码。我想在多个列上进行搜索,就好像我在做一个数据库SELECT。例如,如果前三列是NAME, AGE and CITY,我可能想搜索NAME = "Fred", AGE >= 20 and CITY = "Chicago" 所在的项目,然后选择该项目。

  • 最有效的方法是什么?
  • 可以使用 linq 吗?
  • 除了遍历整个项目集合并测试每个列值之外,还有其他方法吗?感谢您的帮助。

【问题讨论】:

  • 我刚刚意识到 listView 只支持与 datagrid 不同的字符串,所以请将任何答案框起来,就好像选择标准都是基于字符串类型变量一样。再次感谢。

标签: c# linq listview search


【解决方案1】:

是的,可以做到,您使用的是multi-column listView control,我假设它有一个像数据表这样的数据源。其中将包含将在控件中呈现的列/行。

您可以轻松地使用 Linq 来实现结果,例如:

dataTable.AsEnumerable
         .Where(x=>x["NAME"] == "Fred")
         .Where(x=>x["AGE"] >= 20)
         .Where(x=>x["CITY"] == "Chicago")

这里每个 x 代表一个 Row,因为您正在枚举 DataTable 的 Row Collection。最终结果将是类型IEnumerable<DataRow>,您需要使用它来创建单独的DataTable,而不是绑定到控件,我不确定您是否可以绑定IEnumerable<DataRow>

同时检查以下链接:

Linq : select value in a datatable column

LINQ query on a DataTable

添加更多细节以进一步帮助 OP,可用的类是 List,您将绑定到控件,这使生活更加轻松,因为它是 IEnumerable 类型,您需要在上面的linq查询如下:

IList<ListClass> lc = new List<ListClass>();

现在lc包含了控件绑定的所有数据,你需要做的是

var Result = lc
             .Where(x=>x.Name == "Fred")
             .Where(x=>x.Age >= 20)
             .Where(x=>x.City == "Chicago").ToList();

这里Result的类型为List&lt;ListClass&gt;,包含过滤后的记录,根据你的要求,可以用来和控件绑定。

这里x 将是Linq 查询中ListClass 的对象,类似地,您可以为Linq 查询动态提供值并继续获取过滤后的子集。 由于我们有强类型对象,因此所有属性都将在智能感知中可用。希望这有助于进一步澄清。

【讨论】:

  • 非常感谢您闪电般的快速响应!抱歉,但我对 C# 和 .NET 世界还很陌生。我能否麻烦您稍微扩展一下您的示例,以便将其放入我的上下文中。给定声明: public IList myList = new List();我将如何应用您上面给出的表达式来搜索此列表。再次感谢
  • 你不清楚哪一部分,以便我可以进一步帮助并添加更多详细信息
  • 在底部添加了更多细节
  • 现在,我正在遍历列表: foreach(ListViewItem myItem in myList) { if ((myItem.SubItems[0].Text == "Fred") && ......等然后做点什么。我将如何使用您的示例而不是我现在正在做的事情。谢谢。
  • 使用我的代码创建一个子列表os main List,Linq查询是Foreach循环的替代品。这里 Result 是 List 类型的,它被过滤了,可以直接提供给控件
【解决方案2】:

ListView.Items的类型是ListView.ListViewItemCollection,实现了IEnumerable,所以肯定可以用LINQ。您可以执行以下操作:

theListView.Items.Where(item =>
    item.Text == "Fred" &&
    Int32.Parse(item.SubItems[0].Text) >= 20 &&
    item.SubItems[1].Text == "Chicago")

【讨论】:

  • 这似乎也是一个好主意,谢谢。我也试试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-22
  • 1970-01-01
  • 2012-10-04
相关资源
最近更新 更多