I Ha luchado durante mucho tiempo con este problema, ya que a menudo uso controles ComboBox, en una Lista <> s de varias clases diferentes.
Realmente no quería codificar nombres de campo en mi función, o tener una función SelectItemByValue por separado para cada tipo de lista <> clase que estaría usando.
Al final se me ocurrió la siguiente solución reutilizable.
List<EmployeeRecord> m_listOfEmployees = GetListOfEmployees();
...
comboBoxEmployees.DataSource = m_listOfEmployees;
comboBoxEmployees.DisplayMember = "EmployeeName";
comboBoxEmployees.ValueMember = "EmployeeID";
para seleccionar el elemento ComboBox con un ID de empleado en particular:
int someEmployeeID = 4;
ComboBoxHelper.SetComboBoxSelectionByValue<EmployeeRecord>(comboBoxEmployees, someEmployeeID);
Y aquí es la función que realiza el trabajo.
Prepárate, no es bonito.
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;
}
Aviso cómo hay que llamar a la función, pasándole el tipo de objetos que se están almacenando en cada ComboBoxItem (EmployeeRecord, en este ejemplo), junto con un puntero a su cuadro combinado y la Valor del elemento que desea establecer como SelectedItem.
ComboBoxHelper.SetComboBoxSelectionByValue<EmployeeRecord>(comboBoxEmployees, someEmployeeID);
La función de los pasos a través de los elementos en el cuadro combinado, se encuentra el campo "ValueMember" en el registro de ese elemento (de empleado, en este ejemplo) y compara el valor de la ValueMember con el parámetro deseado valor.
Lo sé, lo sé, no es bonito, pero cuando se enlaza una lista a un cuadro combinado, entonces no se puede utilizar DataRowView:
DataRowView row = item as DataRowView;
string displayValue = row["someColumnName"].ToString();
Y si quieres una función SetComboBoxSelectionByValue genérica, que se trabaje con listas de cualquier tipo de clases, luego debe comenzar a entrar en PropertyInfos, para encontrar el valor de un campo en su clase particular.
¿Estás haciendo esto para buscar un valor específico en el cuadro combinado? relacionado con tu última pregunta? –