使用c#对listView控件中的项进行多列搜索

时间:2015-06-09 08:10:42

标签: c# linq listview search

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

  • 最有效的方法是什么?
  • 可以使用linq吗?
  • 还有另一种方法是遍历整个项目集合并测试每个列值吗?感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

是的,可以这样做,你使用的是multi-column listView control,我认为它会有像datatable这样的数据源。其中包含将在控件中呈现的列/行。

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

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

此处每个x代表一行,因为您枚举的是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();

此处结果将为List<ListClass>类型,其中包含已过滤的记录,根据您的要求,可用于与控件绑定。

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

答案 1 :(得分:0)

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")