惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
人人都是产品经理
人人都是产品经理
Martin Fowler
Martin Fowler
D
Docker
F
Full Disclosure
Recent Announcements
Recent Announcements
MyScale Blog
MyScale Blog
美团技术团队
Microsoft Azure Blog
Microsoft Azure Blog
B
Blog
A
About on SuperTechFans
IT之家
IT之家
P
Proofpoint News Feed
有赞技术团队
有赞技术团队
V
V2EX
阮一峰的网络日志
阮一峰的网络日志
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
雷峰网
雷峰网
WordPress大学
WordPress大学
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 【当耐特】
V
Visual Studio Blog
Hugging Face - Blog
Hugging Face - Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
Microsoft Security Blog
Microsoft Security Blog
U
Unit 42
腾讯CDC
Stack Overflow Blog
Stack Overflow Blog
B
Blog RSS Feed
I
InfoQ
N
Netflix TechBlog - Medium
博客园 - 三生石上(FineUI控件)
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Vercel News
Vercel News
月光博客
月光博客
F
Fortinet All Blogs
Google DeepMind News
Google DeepMind News
小众软件
小众软件
Recorded Future
Recorded Future
博客园 - Franky
Blog — PlanetScale
Blog — PlanetScale
云风的 BLOG
云风的 BLOG
C
Check Point Blog
博客园 - 叶小钗
GbyAI
GbyAI
M
MIT News - Artificial intelligence
博客园 - 司徒正美

博客园 - 广阔之海

Halcon的三角函数 Halcon轮廓插值方法 深度学习执行速度不稳定的解决方法 Halcon - 深度学习 - 目标分类 Halcon 画一个时钟 Halcon 解方程(solve_matrix) C# 使用Serilog日志框架 Halcon 生成标定板 Halcon 中的形态学 Halcon的提取中心线算法 C# 消灭switch的面向映射编程 C#中Task的用法 Halcon 通过坐标轴过滤点云数据 Halcon图像投影映射 C# 获取MySql的数据库结构信息 C# HttpClient的使用方法总结 MySql字符集导致特殊字符保存出错问题处理 Asp.Net Core 动态生成WebApi Asp.Net Core WebApi中集成Jwt认证
C# 控件选项变化事件处理
广阔之海 · 2025-06-17 · via 博客园 - 广阔之海

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