过滤DataGrid WPF中的字符串数据

时间:2018-01-09 20:06:53

标签: c# wpf search datagrid

我有一个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'..."

我不确定我是否正确地接近了这个问题,并且在如何进行中有点迷失。这里的目标是“实时”搜索响应文本框中每次击键的用户列表。

1 个答案:

答案 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),它更容易使用。