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事件。

 

posted @ 2025-06-17 18:42  广阔之海  阅读(53)  评论(1)    收藏  举报