代码之家  ›  专栏  ›  技术社区  ›  Jackimedes

如何过滤数据网格中的记录?

  •  0
  • Jackimedes  · 技术社区  · 7 年前

    filter wpf datagrid values from a textbox

    public ICollectionView DataGridCollection
    {
       get { return _dataGridCollection; }
       set { _dataGridCollection = value; NotifyPropertyChanged("DataGridCollection"); }
    }
    

    筛选器集合:

    private void FilterCollection()
    {
        if (_dataGridCollection != null)
        {
            _dataGridCollection.Refresh();
        }
    }
    

    DataTable pixsellOrders = SqlConnect(query);    
    Grid.Dispatcher.Invoke(DispatcherPriority.Normal, (ThreadStart)delegate { DataGridCollection = CollectionViewSource.GetDefaultView(pixsellOrders); });
    DataGridCollection.Filter = new Predicate<object>(filter);
    

    过滤器按钮(右键单击):

    private void MenuItem_Click(object sender, RoutedEventArgs e)
        {
            string filter = "";
            FilterBox.Dispatcher.Invoke(DispatcherPriority.Normal, (ThreadStart)delegate { filter = FilterBox.Text; });
    
            if (filter == "")
            {
                Console.WriteLine("no filter");
                return;
            }
            else
            {
                Console.WriteLine(filter);
                FilterCollection();
            }
        }
    

    基于示例:

    private bool filter(object item)
        {
            if (item.Subject.Contains(_searchstr) || item.Reference.Contains(searchstr))
            {
                return true;
            }
            return false;
        }
    

    <Grid DataContext="{Binding ElementName=ResultsWindow}">
        <DataGrid x:Name="Grid" HorizontalAlignment="Stretch" Height="Auto" Margin="20,45,20,60" VerticalAlignment="Stretch" Width="Auto" ItemsSource="{Binding DataGridCollection}"  >
            <DataGrid.Resources>
                <ContextMenu x:Key="DataGridColumnHeaderContextMenu">
                    <MenuItem Header="Filter" Click="MenuItem_Click"/>
                </ContextMenu>
                <Style TargetType="{x:Type DataGridColumnHeader}">
                    <Setter Property="ContextMenu"
                    Value="{StaticResource DataGridColumnHeaderContextMenu}"/>
                </Style>
            </DataGrid.Resources>
        </DataGrid>
        <Button x:Name="BtnBack" Content="Back" HorizontalAlignment="Right" Margin="0,0,20,20" VerticalAlignment="Bottom" Width="76" Click="BtnBack_Click"/>
        <TextBox Height="27" Margin="65,10,0,0" TextWrapping="Wrap" VerticalAlignment="Top" HorizontalAlignment="Left" Width="524" Name="FilterBox"/>
        <Label Content="Filter" HorizontalAlignment="Left" Margin="20,10,0,0" VerticalAlignment="Top"/>
    </Grid>
    

    在本例中,列在过滤器(私有布尔过滤器)中显式声明。我只想筛选选中的列(右键单击列标题并从关联菜单中选择“筛选”)。我该如何调整我必须做的事情?不幸的是,我对XAML没有太多经验。

    2 回复  |  直到 7 年前
        1
  •  1
  •   mm8    7 年前

    过滤a的方法 DataTable 是设置 RowFilter 的属性 DataView https://msdn.microsoft.com/en-us/library/system.data.dataview.rowfilter(v=vs.110).aspx http://www.csharp-examples.net/dataview-rowfilter/ .

    无法筛选 数据视图 数据表 使用 Filter ICollectionView 。不支持:

    Why errors when filters DataTable with CollectionView?

        2
  •  0
  •   aybe    7 年前

    通常,您可以在搜索框中使用一些特殊语法实现按列搜索功能,即。 column:value

    private static bool TryGetValue(string search, out string column, out string value)
    {
        // just an example, should be made more robust
    
        column = null;
    
        value = null;
    
        var match = Regex.Match(search, @"^(\w+):(.*)$");
    
        if (!match.Success)
            return false;
    
        column = match.Groups[1].Value.Trim();
        value = match.Groups[2].Value.Trim();
    
        return true;
    }
    

    例子:

    var strings = new[]
    {
        "column1:abcd",
        "qwerty:asdfg",
        "1234:5678"
    };
    
    foreach (var search in strings)
    {
        string column;
        string value;
    
        if (TryGetValue(search, out column, out value))
        {
            Console.WriteLine($"Column: '{column}'\tValue: '{value}'");
        }
        else
        {
            Console.WriteLine("Invalid syntax");
        }
    }
    

    结果:

    Column: 'column1'       Value: 'abcd'
    Column: 'qwerty'        Value: 'asdfg'
    Column: '1234'  Value: '5678'
    

    这样,用户就负责填写该列,您的代码就不会被硬编码。

    如果搜索查询中没有前缀列,则表示搜索所有列

    此外,您可以在该搜索框中实现自动建议。