Хорошо, давайте попробуем. Если вы хотите реализовать фильтрацию, вам следует подумать о правильной структуре представления критерия фильтра. В этом случае в вашем поле со списком есть метка, которая привязана к уникальному критерию фильтра. Это может быть представлено пользовательским классом:
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
позаботится об отображении соответствующим образом. Но, как я вижу, вы уже сделали это