【问题标题】:Filtering string data in a DataGrid WPF在 DataGrid WPF 中过滤字符串数据
【发布时间】:2018-01-09 20:06:53
【问题描述】:

我有一个包含单列字符串数据的 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'..."

我什至不确定我是否正确地解决了这个问题,并且在如何继续时有点迷失。此处的目标是“实时”搜索响应文本框中每次击键的用户列表。

【问题讨论】:

  • 我猜在您的 XAML 模板中,您在 usersDataGrid 的模板中定义了属性 UserName。您确实意识到您分配的列表包含具有 Column1 属性而不是 UserName 的匿名对象-您为什么还要进行选择投影?
  • 嗯,你的错误有点引导你走向正确的方向。分配“myData”的部分看起来您没有“用户名”字段。我会把它切小一点开始。确保您在 usersData 中有一个具有该列的 dataTable。您总是可以使用便宜的 .Select(r => r[0]) 来获取第一列。

标签: c# wpf search datagrid


【解决方案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();
    }

如果我不确定我有哪些列,我可以在分配“dataTable”后添加一个断点,看看它有什么用于调试。大多数时候,我更喜欢远离 DataTables,并在 3.5 之后使用 C# 和 Linq 的引入更喜欢 POCO。将 Linq 与 DataTables 和集合混合起来很麻烦。最好为特定的属性列表提供格式良好的对象,否则您正在执行 ('stringName') 可能会出错的地方。当你有类似的东西时

public class Foo
{
    public string Bar { get; set; }
}

任何时候你从 Foo 中选择它都会像 .Select(x => x.Bar) 那样使用起来要简单得多。

【讨论】:

    猜你喜欢
    • 2013-03-12
    • 2012-05-18
    • 2017-07-27
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 2021-06-23
    • 2013-11-25
    相关资源
    最近更新 更多