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 集合

posted @ 2025-12-12 11:19  家煜宝宝  阅读(20)  评论(0)    收藏  举报