我在Visual Studio 2013中使用多列listView控件并使用C#编码。我想在多个列上进行搜索,就像我在做数据库SELECT
一样。例如,如果前三列是NAME, AGE and CITY
,我可能想要搜索NAME = "Fred", AGE >= 20 and CITY = "Chicago"
的项目,然后选择该项目。
答案 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
添加更多细节以进一步帮助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")