我有一个列表,其中包含我的WPF Datagrid中显示的数据。我有以下代码在网格中搜索与文本框输入的字符串匹配。 代码位于按钮单击处理程序中。
var search = from s in dglist // dglist is my List<APerson>
where s.FirstName == textBox1.Text
select new
{
Firstname = s.FirstName,
Lastname = s.LastName
};
dataGrid1.ItemsSource = search;
最后一行没有将搜索结果集放回到数据网格中,为什么?
答案 0 :(得分:1)
Tony,Brian是正确的 - 只要您正确配置了列,您的原始代码就可以按照您的描述工作。网格将为您枚举查询,您不需要自己使用ToList()。我创建了一个测试项目并且它有效。您是否可能需要重新访问列的Binding属性?您是否离开网格以自动生成列?如果是这样,当您将项目分配给匿名对象时,网格将不知道要显示的内容。
尝试按如下方式配置列:
<wpftk:DataGrid.Columns>
<wpftk:DataGridTextColumn Header="First Name" Binding="{Binding Path=FirstName}" />
<wpftk:DataGridTextColumn Header="Last Name" Binding="{Binding Path=LastName}"/>
</wpftk:DataGrid.Columns>
此外,在投影中,您使用Firstname = s.FirstName
。请注意名字中的小写n。这与网格的列绑定不匹配,并且不会更新任何内容。您无需在投影中指定其他名称。你可以干脆做
select new {s.FirstName, s.LastName}
...
最后,只是一个建议,我不会直接设置网格的ItemsSource。我会使用DataContext,因为您将来可能会在不同的控件中使用相同的数据。
答案 1 :(得分:1)
我无法提供解决方案,但只提供解决方法:如果您使用
dataGrid1.ItemsSource = search.ToList();
现在将评估LINQ查询,这将触发列表中的更新。
答案 2 :(得分:0)
LINQ查询返回IEnumerable结果集,而ToList返回List&lt;&gt; (当然)。与这些的不同之处在于可枚举,其中List能够通过索引引用,更改列表,并使用方法查找特定值。
我很惊讶原始查询不起作用,这就是为什么你仍然看到你提到的DataGrid中的加载...另外,要返回一个APerson可枚举集合,你需要将你的查询更改为: / p>
选择新的APerson { ... }
这样最终的结果集就是你想要的类型。这可能是匿名类型的另一个问题???不确定那一个。看起来很奇怪......
抱歉,这可能没有用......