C# WinForm中DataGridView ComboBox第二行起重复记录如何解决
问题场景
C# WinForm开发中,DataGridView控件内的ComboBox列从第二行开始出现下拉选项值重复的异常。
异常效果截图:
原有问题代码:
void ListagemNoCombobox() { // 填充判定条件下拉选项 string[] criterios = { "无判定条件", "高三年级", "高二年级", "高一年级" }; foreach (string crit in criterios) { cmbCriterio.Items.Add(crit); } }
故障原因
DataGridView的ComboBox编辑控件会在行切换时被复用,现有代码每次执行绑定逻辑时都直接向Items集合追加选项,没有做清空或重复绑定判断,每进入一次编辑状态就会多追加一遍相同选项,导致从第二行开始下拉值重复。
修复方案
二选一即可,固定选项场景优先选择第一种方案:
- 直接给ComboBox列绑定固定数据源
不需要在编辑事件中逐个操作控件项,在窗体初始化、DataGridView绑定阶段执行一次列绑定即可,全局生效不会出现重复:void BindCriterioComboBoxColumn() { string[] criterios = { "无判定条件", "高三年级", "高二年级", "高一年级" }; // 替换为实际的DataGridView控件名、ComboBox列名 var targetCol = dataGridView1.Columns["你的ComboBox列名"] as DataGridViewComboBoxColumn; targetCol.DataSource = criterios; // 如果下拉选项是键值对形式,额外配置DisplayMember、ValueMember属性即可 } - 动态选项场景下,编辑控件绑定时先清空原有项
如果不同行需要加载不同的下拉选项,需要在EditingControlShowing事件中处理,核心是每次加项前先清空现有集合:private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { // 替换为实际的ComboBox列索引、列名判断 if (dataGridView1.CurrentCell.ColumnIndex == 2 && e.Control is ComboBox cmbCriterio) { // 必须先清空,否则会重复追加 cmbCriterio.Items.Clear(); string[] criterios = { "无判定条件", "高三年级", "高二年级", "高一年级" }; cmbCriterio.Items.AddRange(criterios); } }
注意:不要多次调用列数据源绑定方法,也不要在循环行的逻辑里重复给列加项,否则同样会出现选项重复问题。
内容的提问来源于stack exchange,提问作者Ruy GUerra
相关产品推荐
相关产品推荐

