C# 控件選項(xiàng)變化事件處理
ComboBox 與 DataGridView 選項(xiàng)變化事件處理中的問題總結(jié),代碼如下:
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("=========== 初始化結(jié)束 ============"); } 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如果綁定同一數(shù)據(jù)源則會(huì)產(chǎn)生聯(lián)動(dòng)效應(yīng),所以在代碼中用不同的數(shù)據(jù)源進(jìn)行綁定。初始化結(jié)束后,再依次點(diǎn)擊DataGridView的第二、三行,程序執(zhí)行結(jié)果如下:

在初始化時(shí)ComboBox的SelectedIndexChanged事件和SelectedValueChanged事件被多次執(zhí)行,解決此問題的方法有:
1、用Items.Add方式添加下拉項(xiàng),替代DataSource綁定方式;
2、在ComboBox初始化之后再綁定SelectedIndexChanged或SelectedValueChanged事件,注意重新初始化時(shí)需先解綁事件;
3、(推薦)使用SelectionChangeCommitted事件,此事件只在用戶改變當(dāng)前項(xiàng)時(shí)觸發(fā),初始化時(shí)可以手動(dòng)調(diào)用。
在改變DataGridView的當(dāng)前行時(shí),RowEnter事件仍然會(huì)在初始化之后重復(fù)產(chǎn)生一次,解決此問題的方法就是:
用SelectionChanged事件替代RowEnter事件。

浙公網(wǎng)安備 33010602011771號(hào)