I Ich habe lange mit diesem Problem gekämpft, da ich oft ComboBox-Steuerelemente verwende, die an eine Liste verschiedener Klassen gebunden sind.
Ich wollte nicht wirklich Feldnamen in meiner Funktion fest codieren, oder habe eine separate SelectItemByValue-Funktion für jeden Typ der Liste <> Klasse, die ich verwenden würde.
Ich kam schließlich mit der folgenden wiederverwendbaren Lösung.
List<EmployeeRecord> m_listOfEmployees = GetListOfEmployees();
...
comboBoxEmployees.DataSource = m_listOfEmployees;
comboBoxEmployees.DisplayMember = "EmployeeName";
comboBoxEmployees.ValueMember = "EmployeeID";
Um den ComboBox Artikel mit einer bestimmten Mitarbeiter-ID zu wählen:
int someEmployeeID = 4;
ComboBoxHelper.SetComboBoxSelectionByValue<EmployeeRecord>(comboBoxEmployees, someEmployeeID);
Und hier ist die Funktion, die die Arbeit erledigt.
Halten Sie sich selbst, es ist nicht schön.
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;
}
Beachten Sie, wie Sie die Funktion aufrufen, ist es die Weitergabe Typ von Objekten, die in jedem ComboBoxItem (EmployeeRecord, in diesem Beispiel), zusammen mit einem Zeiger auf Ihre ComboBox gespeichert werden und die Wert des Elements, das als SelectedItem festgelegt werden soll.
ComboBoxHelper.SetComboBoxSelectionByValue<EmployeeRecord>(comboBoxEmployees, someEmployeeID);
Die Funktionsschritte durch die Elemente in der ComboBox-, findet die „Valuemember“ Feld in diesem Datensatz Stück (EmployeeID, in diesem Beispiel), und vergleicht den Wert des Valuemember mit den gewünschten Wert Parametern.
Ich weiß, ich weiß, es ist nicht schön ist, aber wenn Sie eine Liste an eine ComboBox binden, dann können Sie nicht verwenden DataRowView:
DataRowView row = item as DataRowView;
string displayValue = row["someColumnName"].ToString();
Und wenn Sie eine generische SetComboBoxSelectionByValue Funktion wollen, denen Wenn Sie mit Listen beliebiger Klassen arbeiten, müssen Sie sich an PropertyInfos wenden, um den Wert eines Feldes in Ihrer Klasse zu ermitteln.
tun Sie dies, um nach einem bestimmten Wert in der Combobox zu suchen? bezogen auf deine letzte Frage? –