首页>Program>source

我使用以下方法在数据网格中加载对象列表:

dataGrid1.Items.Add(model);

维兹威兹 成为数据库中的数据.它有一个 modelId(int)Name(string)

在我的数据网格中,我仅显示 Text(string)的名称 .在文本框中输入内容后,现在如何过滤数据网格?

我在此页面上:http ://msdn.microsoft.com/zh-cn/library/vstudio/ff407126(v = vs.100).aspx,但我不理解那里的代码,也无法解释应该如何转置

model
最新回答
  • 4天前
    1 #

    有多种方法可以过滤Collection

    让我们建议这是您的物品类别

    public class Model
    {
        public string Name
        {
            get;
            set;
        }
    }
    

    您的收藏集看起来像

          var ObColl = new ObservableCollection<Model>();
            ObColl.Add(new Model() { Name = "John" });
            ObColl.Add(new Model() { Name = "Karl" });
            ObColl.Add(new Model() { Name = "Max" });
            ObColl.Add(new Model() { Name = "Mary" });
    
    方法1(谓词):
       public MainWindow()
        {
            InitializeComponent();
            // Collection which will take your ObservableCollection
            var _itemSourceList = new CollectionViewSource() { Source = ObColl };
            // ICollectionView the View/UI part 
            ICollectionView Itemlist = _itemSourceList.View;
            // your Filter
            var yourCostumFilter= new Predicate<object>(item => ((Model)item).Name.Contains("Max"));
            //now we add our Filter
            Itemlist.Filter = yourCostumFilter;
            dataGrid1.ItemsSource = Itemlist;
        }
    
    方法2(FilterEventHandler):
       public MainWindow()
        {
            InitializeComponent();
            // Collection which will take your Filter
            var _itemSourceList = new CollectionViewSource() { Source = ObColl };
           //now we add our Filter
           _itemSourceList.Filter += new FilterEventHandler(yourFilter);
            // ICollectionView the View/UI part 
            ICollectionView Itemlist = _itemSourceList.View;
            dataGrid1.ItemsSource = Itemlist;
        }
        private void yourFilter(object sender, FilterEventArgs e)
        {
            var obj = e.Item as Model;
            if (obj != null)
            {
                if (obj.Name.Contains("Max"))
                    e.Accepted = true;
                else
                    e.Accepted = false;
            }
        }
    
    将信息扩展到方法1

    如果需要多个条件或某些复杂的过滤器,则可以在Predicat中添加方法

       // your Filter
        var yourComplexFilter= new Predicate<object>(ComplexFilter);
        private bool ComplexFilter(object obj)
        {
            //your logic
        }
    

  • 4天前
    2 #

    这是使用ICollectionView的Filter属性的简单实现.假设您的XAML包含以下内容:

    <TextBox x:Name="SearchTextBox" />
    <Button x:Name="SearchButton"
            Content="Search"
            Click="SearchButton_OnClick"
            Grid.Row="1" />
    <DataGrid x:Name="MyDataGrid"
              Grid.Row="2">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Lorem ipsum column"
                                Binding="{Binding}" />
        </DataGrid.Columns>
    </DataGrid>
    

    然后在构造函数中,您可以获取数据的默认视图,在该视图中可以设置过滤谓词,该谓词将对集合的每个项目执行. CollectionView不知道何时更新集合,因此,当用户单击搜索按钮时,您必须调用Refresh。

    private ICollectionView defaultView;
    public MainWindow()
    {
        InitializeComponent();
        string[] items = new string[]
        {
            "Asdf",
            "qwer",
            "sdfg",
            "wert",
        };
        this.defaultView = CollectionViewSource.GetDefaultView(items);
        this.defaultView.Filter =
            w => ((string)w).Contains(SearchTextBox.Text);
        MyDataGrid.ItemsSource = this.defaultView;
    }
    private void SearchButton_OnClick(object sender, RoutedEventArgs e)
    {
        this.defaultView.Refresh();
    }
    

    在此URL上,您可以找到CollectionViews的更详细描述: http://wpftutorial.net/DataViews.html

  • 4天前
    3 #

    @wiiMaxx,由于评论不足而无法发表评论.对于那里的直接演员,我会更加谨慎.如果将同一过滤器应用于保存不同复杂类型数据的网格,则它们可能会变得很慢,而对于另一件事则很慢。

    // your Filter
        var yourCostumFilter= new Predicate<object>(item =>
        {
            item = item as Model;
            return item == null || item.Name.Contains("Max");
        });
    

    这不会破坏您的数据网格,并且如果强制转换失败也不会过滤结果.如果您输入的代码错误,对用户的影响较小.最重要的是,由于" as"运算符没有像直接转换操作那样进行任何显式类型强制,因此筛选器将更快。

  • 4天前
    4 #

    看看DataBinding->在您的情况下,请不要添加 项目添加到网格中,但设置itemssource

    <Datagrid ItemsSource="{Binding MyCollectionOfModels}" />
    

    dataGrid1.ItemsSource = this._myCollectionOfModels;
    

    如果要进行某种过滤,排序,分组,请查看CollectionView

  • 4天前
    5 #

    您可以使用dataview过滤器来过滤datagrid行。

               DataView dv = datatable.DefaultView;
                StringBuilder sb = new StringBuilder();
                foreach (DataColumn column in dv.Table.Columns)
                {
                    sb.AppendFormat("[{0}] Like '%{1}%' OR ", column.ColumnName, "FilterString");
                }
                sb.Remove(sb.Length - 3, 3);
                dv.RowFilter = sb.ToString();
                dgvReports.ItemsSource = dv;
                dgvReports.Items.Refresh();
    

    在"数据表"是提供给数据网格的数据源的地方,并使用字符串生成器来构建过滤器查询,其中"过滤字符串"是要在数据网格中搜索的文本,并将其设置为数据视图,最后将数据视图设置为itemsource 到您的数据网格并刷新它。

  • python:Django使用登录的windows域用户进行身份验证
  • oracle:检查数据库表中是否有某些记录的最快方法?