我有一个DataGrid,它有一列字符串数据。 datagrid的ItemsSource是一个DataSet。
我想通过文本框实时过滤这个。我想出了这个,主要是作为概念的证明。 UsersSearchChanged就是文本框文本更改时触发的偶数:
private void UsersSearchChanged(object sender, RoutedEventArgs e)
{
SearchForUser(SearchUsersTextBox.Text);
}
private void SearchForUser(string searchTerm)
{
var myData = usersData.Tables[0].AsEnumerable().Select(r => new
{
column1 = r.Field<string>("UserName")
});
var list = myData.ToList();
var filtered = list.Where(name => name.column1.StartsWith(searchTerm));
usersDataGrid.ItemsSource = filtered;
}
虽然这不起作用并返回错误:
"BindingExpression path error: 'UserName' property not found on 'object'..."
我不确定我是否正确地接近了这个问题,并且在如何进行中有点迷失。这里的目标是“实时”搜索响应文本框中每次击键的用户列表。
答案 0 :(得分:1)
我已经提到过评论,但我认为你可以更容易地分开它们,看看它们包含什么。通常是这样的:
static void Main(string[] args)
{
DataTable d = new DataTable();
d.Columns.Add("ItemName", typeof(int));
d.Columns.Add("MinValue", typeof(float));
d.Columns.Add("MaxValue", typeof(float));
d.Rows.Add(1, 0.1, 0.2);
d.Rows.Add(1, 0.2, 0.4);
d.Rows.Add(1, 0.1, 0.2);
var dataTable = d.AsEnumerable();
var data = dataTable.Select(x => x[0]).ToList();
Console.WriteLine($"{data.Count}");
Console.ReadLine();
}
如果我不确定我拥有哪些列,我可以在“数据表”之后添加一个断点。被分配,看看它有什么调试。我更喜欢远离DataTables,并且在3.5和Linq的引入之后使用C#支持POCO。将Linq与DataTables和集合混合起来很麻烦。最好为特定的属性列表提供格式良好的对象,否则你正在做(&#39; stringName&#39;),你可能会出错。当你有像
这样的东西public class Foo
{
public string Bar { get; set; }
}
任何时候你从Foo中选择它就像.Select(x =&gt; x.Bar),它更容易使用。