我有一个包含ListBox
和Combobox
的winform。在此ListBox
中,出现了首次运行的客户列表。
我想用ListBox
过滤Combobox
中的“客户”。
使用我正在使用的ListBox
中选择的字符串填充Combobox
:
private void FillListBox()
{
this.lstClient.Items.Clear();
foreach (Client c in this.client)
{
if (this.cBox.Text == "All")
this.lstClient.Items.Add(c.ToString());
else
if (this.cBox.Text == "Retail" && c.GetType() == typeof(RetailClient))
this.lstClient.Items.Add(c.ToString());
}
this.lstClient.Sorted = true;
}
之后,我从ComboBox的事件中调用此方法:
private void cBox_TextChanged(object sender, EventArgs e)
{
this.FillListBox();
}
它可以“很好”地工作,但是我的代码不是真正动态的并且太长(很多不同的客户端),这就是为什么我想使用LINQ。 我读过Microsoft的文档,但对如何使用却很困惑。
有人有时间给我指路吗?
添加信息:
我的表格:
我在ComboBox中选择所需的类型:
结果:
谢谢
答案 0 :(得分:1)
好,让我们尝试一下。如果要实施过滤,则应考虑一种适当的结构,该结构如何表示您的过滤条件。在这种情况下,您的组合框中将有一个标签,该标签绑定到唯一的过滤条件。这可以由一个自定义类表示:
public class SortingRepresentation
{
public string DisplayLabel { get; set; }
public Type ClientType { get; set; }
}
现在,您可以创建这些条件的列表,并将其放入组合框:
List<SortingRepresentation> sortingFields = new List<SortingRepresentation>();
public Form1()
{
sortingFields.Add(new SortingRepresentation{ DisplayLabel = "All", TypeCriterion = typeof(Client) });
sortingFields.Add(new SortingRepresentation{ DisplayLabel = "Only Retail", TypeCriterion = typeof(Client_A) });
sortingFields.Add(new SortingRepresentation{ DisplayLabel = "Only Wholesale", TypeCriterion = typeof(Client_B) });
sortingFields.Add(new SortingRepresentation{ DisplayLabel = "Only Human Wholesale", TypeCriterion = typeof(Client_C) });
cBox.DisplayMember = "DisplayLabel";
cBox.DataSource = sortingFields;
}
当组合框中的选择更改时,您现在可以捕获所选项目(类型为SortingRepresentation
,并将其作为过滤器传递到FillListBox
:
private void cBox_SelectedIndexChanged(object sender, EventArgs e)
{
FillListBox((SortingRepresentation)cBox.SelectedItem);
}
现在,您可以在此对象内使用Type TypeCriterion
来过滤列表:
private void FillListBox(SortingRepresentation sortcriterion)
{
this.lstClient.DataSource = null;
this.lstClient.DataSource = client
.Where(x => x.GetType() == sortcriterion.TypeCriterion || // either you are of this type
x.GetType().BaseType == sortcriterion.TypeCriterion // or your parent is of this type
).ToList();
}
由于您使用的是列表框,因此可以将排序后的列表直接绑定到DataSource
上并完成此操作。为了正确显示,您需要在ToString
类中覆盖Client
方法,ListBox
将相应地处理显示。但据我所知您已经完成了