【问题标题】:Using Linq to filter a ComboBox.DataSource?使用 Linq 过滤 ComboBox.DataSource?
【发布时间】:2011-01-30 02:12:55
【问题描述】:

在另一个主题中,我偶然发现了 Darin Dimitrov 这个非常优雅的解决方案,通过选择另一个 ComboBox 来过滤一个 ComboBox 的 DataSource: how to filter combobox in combobox using c#

combo2.DataSource = ((IEnumerable<string>)c.DataSource)
.Where(x => x == (string)combo1.SelectedValue);

我想做类似的事情,但不是通过第二个组合框过滤,我想通过文本框的文本进行过滤。 (基本上,用户无需从第二个 ComboBox 中进行选择,只需将他的过滤器输入到 TextBox 中)。然而,事实证明它并不像我希望的那样直截了当。我尝试了以下内容,但失败了:

     cbWohndresse.DataSource = ((IEnumerable<DataSet>)ds)
            .Where(x => x.Tables["Adresse"].Select("AdrLabel LIKE '%TEST%'"));
        cbWohndresse.DisplayMember = "Adresse.AdrLabel";
        cbWohndresse.ValueMember = "Adresse.adress_id";

ds 是我想用作过滤数据源的 DataSet"Adresse" 是这个DataSet 中的一个DataTable。它包含一个 DataColumn "AdrLabel"。现在我只想显示那些“AdrLabel”,其中包含来自用户输入的字符串。 (目前,%TEST% 替换了 textbox.text。)

上面的代码失败是因为 lambda 表达式没有返回 Bool。但我敢肯定,还有其他问题(IEnumerable应该使用哪种类型?现在是DataSet,但是Darin使用了String。但是我怎样才能将DataSet转换为字符串呢?

是的,我是新人,我的经验是“无效的”,而且在公开场合也是如此。所以请原谅我的愚蠢问题。

非常感谢您的帮助,因为我自己无法解决这个问题(已经很努力了)。

非常感谢!

佩舍

附:我只是使用 Linq 为 ComboBox 实现一个简单的过滤器(避免视图)。其余的不是基于 Linq,而是基于老式 Ado.NET(ds 由 SqlDataAdapter 填充),如果这很重要的话。

【问题讨论】:

    标签: c# linq combobox dataset filter


    【解决方案1】:

    在我看来,LINQ 并不是一个明显的解决方案。您的数据已经加载到 DataSet 结构中,因此您应该能够执行以下操作:

    var adresse = ds.Tables["Adresse"];
    adresse.DefaultView.RowFilter = "AdrLabel LIKE '%TEST%'";
    
    cbWohndresse.DataSource = adresse;
    cbWohndresse.DisplayMember = "AdrLabel";
    cbWohndresse.ValueMember = "adress_id"
    cbWohndresse.DataBind();
    

    解决当前代码中的实际问题:

    1. 如果 ds 的类型为 DataSet,则将其转换为 IEnumerable&lt;DataSet&gt; 将失败。
    2. DataTable.Select 返回一个行数组,而不是布尔值。
    3. 忽略#1 和#2,您的Where() 调用将返回零、一个或多个DataSet 实例,每个实例都有一个名为“Adresse”的表,其中至少有一行与过滤器匹配。因此,您最终会将您的演示控件绑定到一组 DataSet 实例,这不是您需要的。

    【讨论】:

    • 非常感谢您的超快回放!这看起来像是我以前不知道的直截了当的方法!对实际问题的分析对我来说也很有趣-因为我是初学者并且渴望学习:)
    【解决方案2】:

    如果您想使用 LINQ,则需要添加引用 System.Data.DataSetExtensions。然后,您可以以“linqish”的方式查询您的 DataSet。

    Erick Thompson 的博文 Querying DataSets – Introduction to LINQ to DataSet 是 Microsoft 的一名 PM,它很好地介绍了 LINQ to DataSets

    这是一个非常粗略的例子:

    XAML

    <StackPanel>
    
        <TextBox x:Name="MyFilter" />
    
        <ComboBox x:Name="MyComboBox" 
                  ItemsSource="{Binding}"
                  DisplayMemberPath="AdrLabel" />
    
        <Button Click="OnFilterClick">Filter</Button>
    
    </StackPanel>
    

    代码背后

    public partial class FilteredDataSet : Window
    {
        public FilteredDataSet()
        {
            InitializeComponent();
    
            CreateDataContext();
            MyComboBox.DataContext = MyDataSet.Tables[0];
        }
    
        private DataSet MyDataSet { get; set; }
        private void CreateDataContext()
        {
            var ds = new DataSet();
            var dt = new DataTable( "Adresse" );
            ds.Tables.Add( dt );
    
            var dc = new DataColumn( "AdrLabel" );
            dt.Columns.Add( dc );
    
            DataRow dr = dt.NewRow();
            dr[0] = "one";
            dt.Rows.Add( dr );
    
            dr = dt.NewRow();
            dr[0] = "honed";
            dt.Rows.Add( dr );
    
            dr = dt.NewRow();
            dr[0] = "obiwone";
            dt.Rows.Add( dr );
    
            dr = dt.NewRow();
            dr[0] = "won";
            dt.Rows.Add( dr );
    
            MyDataSet = ds;
    
        }
        private void OnFilterClick( object sender, RoutedEventArgs e )
        {
            string filter = MyFilter.Text;
    
            var context = MyDataSet.Tables[0].AsEnumerable()
                .Where( dr => dr.Field<string>( "AdrLabel" ).Contains( filter ) )
                .Select( dr => dr.Field<string>( "AdrLabel" ) );
    
            MyComboBox.DisplayMemberPath = string.Empty;
    
            MyComboBox.DataContext = context;
        }
    }
    

    【讨论】:

    • 我也非常感谢你!这似乎是一个非常乐于助人、友好的人的好地方。现在我有不同的方法来解决我的问题,给我最好的洞察力。非常感谢!不幸的是,我还没有足够的声望来投票。
    • 回来,访问,贡献:) 一定要“接受”你的问题的答案。欢迎!
    • 只能接受一个答案。不选择他们作为答案不会伤害任何人的感受。请务必选择适合您的答案。 :)
    • 好吧,这很遗憾,因为这两个答案都很好并且有效。我只是给你一个虚拟的大拇指,然后:)
    猜你喜欢
    • 2015-07-12
    • 2011-07-02
    • 2016-12-09
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多