C#如何获取DataGridView单元格内ComboBox的ValueMember值
错误原因
直接强转单元格为ComboBox的写法无法生效,核心原因有两点:
DataGridViewComboBoxColumn对应的单元格类型为DataGridViewComboBoxCell,不属于ComboBox窗体控件。仅当单元格进入编辑状态时,才会临时生成ComboBox实例承载交互,非编辑状态下不存在可直接访问的ComboBox控件对象。- 读取
ValueMember的逻辑本身存在偏差:ValueMember是ComboBox列配置的「值绑定字段名」,属于固定的配置字符串,你实际需要获取的是单元格当前选中项对应的绑定值,而非这个配置属性本身。
正确实现方式
前置确认:请确保
HoltID列类型为DataGridViewComboBoxColumn,且已经提前正确配置了DataSource、DisplayMember、ValueMember属性,否则单元格Value可能返回空值或显示文本。
你当前逐行读取选中值写入DataSet的场景,完全不需要获取ComboBox控件实例,直接读取单元格的Value属性即可,该属性会直接返回ValueMember配置对应的选中项实际值,就是你需要存入HoltID字段的内容。注意循环时需要跳过DataGridView末尾的用户新增空白行,避免空值报错。
修正后的完整代码如下:
private void button2_Click(object sender, EventArgs e) { try { DataSet ds = new DataSet(); OleDbDataAdapter t3DataAdapter = new OleDbDataAdapter(new OleDbCommand("SELECT * FROM Adok;", conn)); OleDbCommandBuilder t3Command = new OleDbCommandBuilder(t3DataAdapter); t3DataAdapter.FillSchema(ds, SchemaType.Source, "Adok"); // 遍历所有行,跳过末尾未提交的新增空白行 for (int i = 0; i < dataGridView3.Rows.Count; i++) { DataGridViewRow currentRow = dataGridView3.Rows[i]; if (currentRow.IsNewRow) continue; DataRow row4 = ds.Tables["Adok"].NewRow(); // 直接读取单元格Value,即为ComboBox选中的目标值 row4["HoltID"] = currentRow.Cells["HoltID"].Value; ds.Tables["Adok"].Rows.Add(row4); } // 若需要将变更提交回数据库,可放开以下代码 // t3DataAdapter.Update(ds, "Adok"); } catch (Exception ex) { MessageBox.Show($"处理出错:{ex.Message}"); } }
特殊场景:获取编辑状态下的内嵌ComboBox控件
如果你后续需要操作编辑状态下的ComboBox实例(比如动态修改下拉项、调整控件样式),可以通过EditingControlShowing事件获取临时的控件实例,示例代码如下:
private void dataGridView3_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { // 判断当前编辑的是目标列,且承载控件为ComboBox if (dataGridView3.CurrentCell.OwningColumn.Name == "HoltID" && e.Control is ComboBox editCombo) { // 此处可直接操作ComboBox实例,比如修改下拉样式、绑定选中事件等 editCombo.DropDownStyle = ComboBoxStyle.DropDownList; } }
注意:该方式获取的ComboBox是临时编辑控件,单元格退出编辑状态后会被销毁,不要缓存该实例做跨状态操作,否则会触发异常。
内容的提问来源于stack exchange,提问作者Molnar Istvan
相关产品推荐
相关产品推荐

