在DataGrid中搜索

时间:2016-05-27 07:08:20

标签: wpf datagrid

我想通过键入文本框来搜索数据网格,但我无法找到解决方案。

我需要做任何绑定吗?如果是的话,我该怎么做?

here's a image

2 个答案:

答案 0 :(得分:0)

如果您希望在Datagrid中使用过滤器文本,即按名称,请尝试此操作...

private bool DataMatchesFilterText(User user, string filterText)
{
    return user.Name.ToString() == filterText;
}

答案 1 :(得分:-1)

是的,您需要将数据网格绑定到包含所有数据的属性。 然后在文本框中添加一个事件处理程序,以处理其中一个关键事件,例如: XAML:

<TextBox x:Name="SearchBox" KeyUp="FilterTextBox_TextChanged" />

然后在后面的代码中你需要对该事件采取行动。在这里,您需要提取过滤器文本,获取DataGrid中的行,然后执行一些方法来确定它是否应该可见。您需要实现自己的DataMatchesFilterText方法。

代码隐藏:

    private void FilterTextBox_TextChanged(object sender, KeyEventArgs e)
    {
        var filterTextBox = (TextBox)sender;
        var filterText = filterTextBox.Text;

        SetRowVisibilityByFilterText(filterText);
    }

    private void SetRowVisibilityByFilterText(string filterText)
    {
        GetVisibleRows(yourGrid)
            .ToList()
            .ForEach(
            x =>
            {
                if (x == null) return;

                x.Visibility =
                DataMatchesFilterText(x.Item as YourRowProperty, filterText) ? Visibility.Visible : Visibility.Collapsed;
            });

    }

    public static IEnumerable<DataGridRow> GetVisibleRows(DataGrid grid)
    {
        if (grid == null || grid.Items == null) yield break;
        int count = grid.ItemsSource == null
            ? grid.Items.Count
            : grid.ItemsSource.Cast<object>().Count();


        for (int i = 0; i < count; i++)
        {
            yield return (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(i);
        }
    }