Фильтрация ListBox с использованием combobox и LINQ

У меня есть winform, который включает ListBox и Combobox . В этом 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:

Поле со списком

Результат :

Результат

Спасибо

Всего 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 вы можете поймать выбранный элемент (который будет иметь тип 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();
}

Поскольку вы используете список, вы можете привязать отсортированный список непосредственно к источнику данных и покончить с этим. Для правильного отображения вам необходимо переопределить метод ToString в вашем классе Client и ListBox позаботится об отображении соответствующим образом. Но, как я вижу, вы уже сделали это


Есть идеи?

10000