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

如何将DataGridView选中行的单元格值批量读取到多个ComboBox控件中

问题根因

你现有代码的核心错误是for循环的判断条件写反了:
你写的是for (int i = 0; i >= numberofcolumns; i++),i初始值为0,只要列数大于0,0 >= 列数的判断永远为假,循环体内的逻辑完全不会执行,这就是你定位到for语句之后逻辑异常的核心原因。


极简解决方案

你需要最多支持20个列对应ComboBox的需求,不需要写十几行重复赋值代码,按下面两步调整即可:

1. 提前统一管理对应列的ComboBox

在窗体类里定义全局列表,存储和DataGridView列顺序一一对应的ComboBox,一次配置后续不用修改:

// 全局变量,按顺序对应DataGridView第0列、第1列...需要绑定的ComboBox
private List<ComboBox> columnBoundCbs;

// 窗体Load/构造函数里初始化列表,替换成你实际的ComboBox名称即可
private void Form1_Load(object sender, EventArgs e)
{
    columnBoundCbs = new List<ComboBox>
    {
        CBKaNr, // 对应第0列
        CBXX1,  // 对应第1列,按实际列顺序补充
        CBXX2,  // 对应第2列,最多加20个即可满足上限需求
        // ... 其他ComboBox
    };
}

2. 修正CellClick事件逻辑

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
    // 排除点击表头的异常场景
    if (e.RowIndex < 0) return;
    
    var targetRow = dataGridView1.Rows[e.RowIndex];
    dataGridView1.CurrentRow.Selected = true;

    // 遍历所有要绑定的ComboBox
    for (int i = 0; i < columnBoundCbs.Count; i++)
    {
        // 避免列数不足时下标越界
        if (i >= dataGridView1.Columns.Count) break;
        
        var currentCb = columnBoundCbs[i];
        currentCb.Items.Clear();
        var cellVal = targetRow.Cells[i].Value;
        if (cellVal != null)
        {
            currentCb.Items.Add(cellVal.ToString());
            // 可选配置:默认直接选中当前值,无需用户手动选择
            currentCb.SelectedIndex = 0;
        }
    }
}

补充说明

如果你需要把所有历史行的同列值都加入对应ComboBox的下拉选项,而非仅当前选中行的对应列值,只需调整循环逻辑,遍历DataGridView所有行取对应列的值去重后加入ComboBox即可,整体框架不需要改动。

内容的提问来源于stack exchange,提问作者DieserTBZ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:45:00