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

在文本框中筛选数据报

  •  25
  • serhio  · 技术社区  · 14 年前

    我搜索一个示例或示例以通过文本框筛选wpf datagrid列元素。

    类似于 this的内容 (给定的示例使用a wpftoolkit 。。显然被微软抛弃了……)

    <canvas>
    <datagrid height=“200”name=“datagrid1”width=“200”画布。top=“23”/>gt;
    <textbox name=“textbox 1”width=“120”/>
    &帆布& GT;
    < /代码> 
    
    

    CS:

    public-partial-class-mainwindow:window
    {
    个人列表
    i收集视图cvPersonnes;
    
    公共主窗口()
    {
    初始化组件();
    
    persons=新列表<personne>();
    
    persons.add(new personne()id=1,nom=“jean michel”,prenom=“badanhar”);
    persons.add(new personne()id=1,nom=“gerard”,prenom=“depardieu”);
    persons.add(new personne()id=1,nom=“garfild”,prenom=“thecat”);
    persons.add(new personne()id=1,nom=“jean paul”,prenom=“belmondo”);
    
    cvPersonnes=CollectionViewSource.GetDefaultView(个人);
    
    如果(个人!=空)
    {
    DataGrid1.AutoGenerateColumns=true;
    
    
    
    

    alt text

    this

    <Canvas>
        <DataGrid Height="200" Name="dataGrid1" Width="200" Canvas.Top="23" />
        <TextBox  Name="textBox1" Width="120" />
    </Canvas>
    

    public partial class MainWindow : Window
    {
        private List<Personne> persons;
        ICollectionView cvPersonnes;
    
        public MainWindow()
        {
            InitializeComponent();
    
            persons = new List<Personne>();
    
            persons.Add(new Personne() { Id = 1, Nom = "Jean-Michel", Prenom = "BADANHAR" });
            persons.Add(new Personne() { Id = 1, Nom = "Gerard", Prenom = "DEPARDIEU" });
            persons.Add(new Personne() { Id = 1, Nom = "Garfild", Prenom = "THECAT" });
            persons.Add(new Personne() { Id = 1, Nom = "Jean-Paul", Prenom = "BELMONDO" });
    
            cvPersonnes = CollectionViewSource.GetDefaultView(persons);
    
            if (cvPersonnes != null)
            {
                dataGrid1.AutoGenerateColumns = true;
                dataGrid1.ItemsSource = cvPersonnes;
                cvPersonnes.Filter = TextFilter;
            }
        }
    
        public bool TextFilter(object o)
        {
            Personne p = (o as Personne);
            if (p == null) 
                return false;
    
            if (p.Nom.Contains(textBox1.Text))
                return true;
            else
                return false;
        }
    
    }
    
    public class Personne
    {
        public int Id { get; set; }
        public string Nom { get; set; }
        public string Prenom { get; set; }
    }
    
    4 回复  |  直到 6 年前
        1
  •  25
  •   vlad    10 年前

    通过将数据报绑定到 ICollectionView 支持过滤。

    细节 here 为.NET 4。对于.NET 4.5,过程是相同的,但文档似乎已丢失。有一点小意思 here 在“分组、排序和筛选”标题下。

    编辑:在最初编写时,WPF工具包并没有被微软放弃。曾经是它的一部分的控件现在已经在框架中了,工具箱还活着并且做得很好。 here

        2
  •  6
  •   Dmitrii Lobanov    13 年前

    我在不同的地方看到过很多关于这件事的争论…

    要将后者过滤为使用数据表作为源的数据报,下面的代码很常见:

    DataTable dt = new DataTable("Table1");
    
    //fill your datatable...
    
    //after fill...
    dataGrid1.DataContext = dt;
    IBindingListView blv = dt.DefaultView;
    blv.Filter = "NAME = 'MOISES'";
    
        3
  •  3
  •   Mohammed A. Fadil    13 年前

    有几种解决方案,但在我看来,最好的解决方案是只使用 DataGrid 没有发明新继承的样式 DataGird 类型。以下是我发现的最好的:

        4
  •  0
  •   Falcon    14 年前

    我已经编写了自己的filterdatagrid控件,它比codeproject或其他地方提供的更灵活。我既不能在这里发布完整的代码,也不能发布它。

    但是:由于您的数据源很可能被包装到一个ICollectionView中,所以您可以这样做:

        public void ApplyFilters()
        {
            ICollectionView view = CollectionViewSource.GetDefaultView(ItemsSource);
            if (view != null)
            {
                view.Filter = FilterPredicate; 
            }
        }
    
        private bool FilterPredicate(object item)
        {
            var yourBoundItemOrRow = item as BoundItemType;
    
            return aFilterObject.Matches(yourBoundItemOrRow);
        }
    

    您可以基于这个概念轻松实现任何过滤器逻辑。即使是非常,非常强大的过滤器。注意:我在自己的类中有从DataGrid派生的那些方法。它们也可以适应在网格之外工作,例如在用户控件中。