tôi đấu tranh cho các lứa tuổi với vấn đề này, vì tôi thường sử dụng các điều khiển ComboBox, được liên kết với một danh sách các lớp khác nhau của Danh sách <.
Tôi không thực sự muốn mã hóa tên trường trong chức năng của mình hoặc có chức năng SelectItemByValue riêng cho từng loại Danh sách <> lớp tôi muốn sử dụng.
Cuối cùng tôi đã đưa ra giải pháp tái sử dụng sau.
List<EmployeeRecord> m_listOfEmployees = GetListOfEmployees();
...
comboBoxEmployees.DataSource = m_listOfEmployees;
comboBoxEmployees.DisplayMember = "EmployeeName";
comboBoxEmployees.ValueMember = "EmployeeID";
Để chọn mục ComboBox với một ID người lao động cụ thể:
int someEmployeeID = 4;
ComboBoxHelper.SetComboBoxSelectionByValue<EmployeeRecord>(comboBoxEmployees, someEmployeeID);
Và đây là những chức năng mà hiện công việc.
Giành mình, không đẹp.
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;
}
Chú ý làm thế nào bạn có để gọi hàm, đi qua nó là loại của các đối tượng đang được lưu trữ trong mỗi ComboBoxItem (EmployeeRecord, trong ví dụ này), cùng với một con trỏ đến ComboBox của bạn và Giá trị của mục bạn muốn đặt làm SelectedItem.
ComboBoxHelper.SetComboBoxSelectionByValue<EmployeeRecord>(comboBoxEmployees, someEmployeeID);
Chức năng bước qua mục trong ComboBox, tìm "ValueMember" lĩnh vực trong hồ sơ của mục đó (EmployeeID, trong ví dụ này) và so sánh giá trị của ValueMember với mong muốn giá trị tham số.
Tôi biết, tôi biết, nó không đẹp, nhưng khi bạn gắn một danh sách vào một ComboBox, thì bạn không thể sử dụng DataRowView:
DataRowView row = item as DataRowView;
string displayValue = row["someColumnName"].ToString();
Và nếu bạn muốn một chức năng SetComboBoxSelectionByValue chung chung, mà sẽ làm việc với Danh sách của bất kỳ loại lớp nào, sau đó bạn cần bắt đầu tham gia vào PropertyInfos, để tìm giá trị của một trường trong lớp cụ thể của bạn.
bạn có đang thực hiện việc này để tìm một giá trị cụ thể trong combobox không? liên quan đến câu hỏi cuối cùng của bạn? –