如何将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
相关产品推荐
相关产品推荐

