Я боролся с этой проблемой целую вечность, поскольку я часто использую элементы управления ComboBox, связанные с List <> различных классов.
Я действительно не хотел жестко кодировать имена полей в моей функции или иметь отдельную функцию SelectItemByValue для каждого типа класса List <>, который я бы использовал.
В конце концов я нашел следующее многоразовое решение.
List<EmployeeRecord> m_listOfEmployees = GetListOfEmployees();
...
comboBoxEmployees.DataSource = m_listOfEmployees;
comboBoxEmployees.DisplayMember = "EmployeeName";
comboBoxEmployees.ValueMember = "EmployeeID";
Чтобы выбрать элемент ComboBox с определенным идентификатором сотрудника:
int someEmployeeID = 4;
ComboBoxHelper.SetComboBoxSelectionByValue<EmployeeRecord>(comboBoxEmployees, someEmployeeID);
А вот функция, которая делает работу.
Готовься, это не красиво.
public static void SetComboBoxSelectionByValue<T>(ComboBox ctrl, int? value)
{
// If the ComboBox has no items, disable it (so the user can immediately see there's nothing selectable)
ctrl.Enabled = (ctrl.Items.Count > 0);
int inx = 0;
foreach (T t in ctrl.Items)
{
foreach (PropertyInfo info in typeof(T).GetProperties())
{
if (info.Name == ctrl.ValueMember)
{
object val = info.GetValue(t, null);
if (val.ToString() == value.Value.ToString())
{
ctrl.SelectedIndex = inx;
return;
}
}
}
inx++;
}
if (ctrl.Items.Count > 0)
ctrl.SelectedIndex = 0;
}
Обратите внимание, как нужно вызывать функцию, передавая ей тип объектов, которые хранятся в каждом ComboBoxItem ( EmployeeRecord , в этом примере) вместе с указателем на ваш ComboBox и значение элемента, который вы хотите установить в качестве SelectedItem.
ComboBoxHelper.SetComboBoxSelectionByValue<EmployeeRecord>(comboBoxEmployees, someEmployeeID);
Функция просматривает элементы в ComboBox, находит поле «ValueMember» в записи этого элемента (в данном примере EmployeeID) и сравнивает значение ValueMember с требуемым параметром value .
Я знаю, я знаю, это не красиво, но когда вы привязываете List к ComboBox, вы не можете использовать DataRowView:
DataRowView row = item as DataRowView;
string displayValue = row["someColumnName"].ToString();
И если вам нужна одна универсальная функция SetComboBoxSelectionByValue, которая будет работать со списками классов любого типа, то вам нужно начать входить в PropertyInfos, чтобы найти значение поля в вашем конкретном классе.