在另一个主题中,我偶然发现了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);
我想做类似的事情,但是要通过第二个组合框进行过滤,我想按TextBox的文本进行过滤. (基本上,用户无需从第二个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是我想用作过滤数据源的数据集.
“地址”是此数据集中的一个数据表.它包含一个DataColumn“ AdrLabel”.现在,我只想显示那些“ AdrLabel”,其中包含来自用户输入的字符串. (当前,%TEST%替换了textbox.text.)
上面的代码失败,因为lambda表达式不返回Bool.但是我敢肯定,还有其他问题(IEnumerable应该使用哪种类型?现在是DataSet,但是Darin使用String.但是如何将DataSet转换为字符串?
是的,我的经验是无足轻重的,我的经历是“空洞的”,公开场合也是这样.因此,请原谅我一些愚蠢的问题.
非常感谢您的帮助,因为我无法独自解决此问题(已经尝试过).
非常感谢你!
佩舍
附言我仅使用Linq为ComboBox实现简单的过滤器(避免使用View).其余的不是基于Linq,而是基于旧式的Ado.NET(ds由SqlDataAdapter填充),如果这很重要的话.
解决方法:
在我看来,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();
要解决当前代码中的实际问题:
>如果ds的类型为DataSet,则将其强制转换为IEnumerable< DataSet>.将失败.
> DataTable.Select返回一个行数组,而不是布尔值.
>忽略#1和#2,您的Where()调用将返回零,一个或多个DataSet实例,每个实例都有一个名为“ Adresse”的表,其中至少有一行与过滤器匹配.因此,最终您将表示控件绑定到一组DataSet实例上,而这并不是您所需要的.