C# 控件选项变化事件处理
ComboBox 与 DataGridView 选项变化事件处理中的问题总结,代码如下:
private class Person { public int Id { get; set; } public string Name { get; set; } } private void 测试控件事件_Load(object sender, EventArgs e) { List<Person> list = new List<Person>(); list.Add(new Person() { Id = 1, Name = "张三" }); list.Add(new Person() { Id = 2, Name = "李四" }); List<Person> list2 = new List<Person>(); list2.Add(new Person() { Id = 1, Name = "张三" }); list2.Add(new Person() { Id = 2, Name = "李四" }); list2.Add(new Person() { Id = 3, Name = "王五" }); comboBox1.DropDownStyle = ComboBoxStyle.DropDownList; comboBox1.DisplayMember = nameof(Person.Name); comboBox1.ValueMember = nameof(Person.Id); comboBox1.DataSource = list; comboBox1.SelectedValue = 2; dataGridView1.AutoGenerateColumns = false; dataGridView1.Columns[0].DataPropertyName = nameof(Person.Id); dataGridView1.Columns[1].DataPropertyName = nameof(Person.Name); dataGridView1.DataSource = list2; dataGridView1.CurrentCell = dataGridView1.Rows[0].Cells[0]; WriteLog("=========== 初始化结束 ============"); } private void WriteLog(string text) { textBox1.AppendText(text + Environment.NewLine); textBox1.ScrollToCaret(); } private void ComboBox1_SelectedIndexChanged(object sender, EventArgs e) { WriteLog($"ComboBox1_SelectedIndexChanged {comboBox1.SelectedIndex}"); } private void ComboBox1_SelectedValueChanged(object sender, EventArgs e) { WriteLog($"ComboBox1_SelectedValueChanged {comboBox1.SelectedIndex}"); } private void ComboBox1_SelectionChangeCommitted(object sender, EventArgs e) { WriteLog($"ComboBox1_SelectionChangeCommitted {comboBox1.SelectedIndex}"); } private void DataGridView1_RowEnter(object sender, DataGridViewCellEventArgs e) { WriteLog($"DataGridView1_RowEnter {e.RowIndex}"); } private void DataGridView1_SelectionChanged(object sender, EventArgs e) { WriteLog($"DataGridView1_SelectionChanged {dataGridView1.CurrentRow.Index}"); }
注意ComboBox与DataGridView如果绑定同一数据源则会产生联动效应,所以在代码中用不同的数据源进行绑定。初始化结束后,再依次点击DataGridView的第二、三行,程序执行结果如下:

在初始化时ComboBox的SelectedIndexChanged事件和SelectedValueChanged事件被多次执行,解决此问题的方法有:
1、用Items.Add方式添加下拉项,替代DataSource绑定方式;
2、在ComboBox初始化之后再绑定SelectedIndexChanged或SelectedValueChanged事件,注意重新初始化时需先解绑事件;
3、(推荐)使用SelectionChangeCommitted事件,此事件只在用户改变当前项时触发,初始化时可以手动调用。
在改变DataGridView的当前行时,RowEnter事件仍然会在初始化之后重复产生一次,解决此问题的方法就是:
用SelectionChanged事件替代RowEnter事件。

浙公网安备 33010602011771号