ComboBox 控件绑定自定义对象
1. 基础绑定方式
定义自定义类
1 public class Employee 2 { 3 public int Id { get; set; } 4 public string Name { get; set; } 5 public string Department { get; set; } 6 7 // 重写 ToString 方法以控制显示内容 8 public override string ToString() 9 { 10 return $"{Name} ({Department})"; 11 } 12 }
绑定到 ComboBox
1 public partial class Form1 : Form 2 { 3 public Form1() 4 { 5 InitializeComponent(); 6 LoadEmployees(); 7 } 8 9 private void LoadEmployees() 10 { 11 List<Employee> employees = new List<Employee> 12 { 13 new Employee { Id = 1, Name = "张三", Department = "技术部" }, 14 new Employee { Id = 2, Name = "李四", Department = "销售部" }, 15 new Employee { Id = 3, Name = "王五", Department = "人事部" } 16 }; 17 18 // 方法1:直接绑定,使用 ToString() 显示 19 comboBox1.DataSource = employees; 20 comboBox1.DisplayMember = "Name"; // 指定显示哪个属性 21 comboBox1.ValueMember = "Id"; // 指定值成员(可选) 22 } 23 }
2. 使用 DisplayMember 和 ValueMember
1 private void BindComboBoxWithMembers() 2 { 3 List<Product> products = new List<Product> 4 { 5 new Product { ProductId = 101, ProductName = "笔记本电脑", Price = 5999 }, 6 new Product { ProductId = 102, ProductName = "手机", Price = 2999 }, 7 new Product { ProductId = 103, ProductName = "平板电脑", Price = 3999 } 8 }; 9 10 comboBoxProducts.DataSource = products; 11 comboBoxProducts.DisplayMember = "ProductName"; // 显示产品名称 12 comboBoxProducts.ValueMember = "ProductId"; // 实际值为产品ID 13 14 // 设置默认选中项 15 comboBoxProducts.SelectedIndex = 0; 16 }
3. 获取选中的对象
1 private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 2 { 3 if (comboBox1.SelectedItem != null) 4 { 5 // 获取选中的自定义对象 6 Employee selectedEmployee = (Employee)comboBox1.SelectedItem; 7 8 // 或者通过 ValueMember 获取值 9 int selectedId = (int)comboBox1.SelectedValue; 10 11 MessageBox.Show($"选中: {selectedEmployee.Name}, ID: {selectedId}"); 12 } 13 } 14 15 // 获取当前选中的对象 16 private void btnGetSelected_Click(object sender, EventArgs e) 17 { 18 if (comboBox1.SelectedItem is Employee emp) 19 { 20 txtName.Text = emp.Name; 21 txtDepartment.Text = emp.Department; 22 } 23 }
4. 使用 BindingList(支持动态更新)
1 public partial class Form1 : Form 2 { 3 private BindingList<Employee> employeeList; 4 5 public Form1() 6 { 7 InitializeComponent(); 8 InitializeEmployeeList(); 9 } 10 11 private void InitializeEmployeeList() 12 { 13 employeeList = new BindingList<Employee> 14 { 15 new Employee { Id = 1, Name = "张三", Department = "技术部" }, 16 new Employee { Id = 2, Name = "李四", Department = "销售部" } 17 }; 18 19 comboBox1.DataSource = employeeList; 20 comboBox1.DisplayMember = "Name"; 21 comboBox1.ValueMember = "Id"; 22 } 23 24 // 动态添加项目 25 private void btnAddEmployee_Click(object sender, EventArgs e) 26 { 27 employeeList.Add(new Employee 28 { 29 Id = employeeList.Count + 1, 30 Name = txtNewName.Text, 31 Department = txtNewDept.Text 32 }); 33 } 34 }
5. 自定义显示格式
1 // 方法1:在类中重写 ToString 2 public class Product 3 { 4 public int Id { get; set; } 5 public string Name { get; set; } 6 public decimal Price { get; set; } 7 8 public override string ToString() 9 { 10 return $"{Name} - ¥{Price:N2}"; 11 } 12 } 13 14 // 方法2:使用 Format 事件 15 private void comboBox1_Format(object sender, ListControlConvertEventArgs e) 16 { 17 if (e.ListItem is Employee emp) 18 { 19 e.Value = $"{emp.Name} [{emp.Department}]"; 20 } 21 }
注意事项
-
DisplayMember 和 ValueMember 必须是对象的公共属性
-
绑定数据源后,SelectedItem 返回的是整个对象
-
SelectedValue 返回的是 ValueMember 指定的属性值
-
使用 BindingList 可以让 ComboBox 自动响应数据的增删改
-
避免在数据绑定后直接修改 Items 集合

浙公网安备 33010602011771号