Фильтрация ListBox с использованием combobox и LINQ - PullRequest
1 голос
/ 17 мая 2019

У меня есть 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, но я не совсем понимаю, как ее использовать.

У кого-нибудь есть несколько раз, чтобы показать мне путь?

Добавление информации:

Моя форма:

Graphical

Я выбираю нужный тип в ComboBox:

ComboBox

Результат:

Result

Спасибо

1 Ответ

1 голос
/ 17 мая 2019

Хорошо, давайте попробуем. Если вы хотите реализовать фильтрацию, вам следует подумать о правильной структуре представления критерия фильтра. В этом случае в вашем поле со списком есть метка, которая привязана к уникальному критерию фильтра. Это может быть представлено пользовательским классом:

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 позаботится об отображении соответствующим образом. Но, как я вижу, вы уже сделали это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...