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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 18:54:23