使用combobox和LINQ过滤ListBox

时间:2019-05-17 12:46:46

标签: c# linq combobox listbox

我有一个包含ListBoxCombobox的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的文档,但对如何使用却很困惑。

有人有时间给我指路吗?

添加信息:

我的表格:

Graphical

我在ComboBox中选择所需的类型:

ComboBox

结果:

Result

谢谢

1 个答案:

答案 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将相应地处理显示。但据我所知您已经完成了