You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WinForm中DataGridView ComboBox第二行起重复记录如何解决

问题场景

C# WinForm开发中,DataGridView控件内的ComboBox列从第二行开始出现下拉选项值重复的异常。
异常效果截图:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 00:27:42