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

C# DataGridViewComboBoxCell修改后恢复初始值问题求助

问题:DataGridViewComboBoxColumn选择颜色后单元格值自动恢复

我是编程初学者,正在做学校项目的C#桌面应用。用.DataSource把数据库对象列表加载到DataGridView没问题,每行都有对应的颜色。颜色列设置成了DataGridViewComboBoxColumn,点击单元格能看到完整的颜色下拉列表,但选完按回车或离开行后,单元格又变回原来的颜色(比如初始是Red,选Yellow后又变回Red)。

相关代码片段

EplfColor实体类

public class EplfColor
{
    public int eplfColorId{ get; set; }

    public string eplfColorName { get; set; }

    public int eplfColorCode { get; set; }

    public override string ToString()
    {
        return this.eplfColorName;
    }
}

刷新DataGridView方法

private void RefreshDGV()
{
    combocolumn.DataSource = SitacController.GetEplfColor();

    this.DGV_SITAC.DataSource = SitacController.GetAllSitac();
}

Visual Studio设计器代码

// 
// EPLF_Color
// 
EPLF_Color.DataPropertyName = "EplfColor";
EPLF_Color.DataSource = eplfColorBindingSource;
EPLF_Color.DisplayMember = "eplfColorName";
EPLF_Color.HeaderText = "EPLF Color";
EPLF_Color.MinimumWidth = 6;
EPLF_Color.Name = "EPLF_Color";
EPLF_Color.Resizable = DataGridViewTriState.True;
EPLF_Color.SortMode = DataGridViewColumnSortMode.Automatic;
EPLF_Color.ValueMember = "eplfColorId";
// 
// eplfColorBindingSource
// 
eplfColorBindingSource.DataSource = typeof(Models.EplfColor);

问题原因

核心是数据绑定的类型不匹配:

  • DataGridView行数据(Sitac实体)的EplfColor属性是EplfColor对象类型
  • 但ComboBox列的ValueMember设为eplfColorId(int类型),选择下拉项时会把int类型的ID赋值给EplfColor对象属性,类型不兼容导致赋值失败,单元格只能保留原对象值,所以看起来恢复了初始颜色。
  • 同时代码里手动给combocolumn.DataSource赋值,和设计器中绑定的eplfColorBindingSource存在重复绑定冲突。

解决方案

方案1:改用颜色ID作为绑定属性

如果你的Sitac实体当前是public EplfColor EplfColor { get; set; },修改为:

// 存储数据库中的颜色ID
public int EplfColorId { get; set; }
// 可选:保留对象属性用于显示或其他业务逻辑
public EplfColor EplfColor { get; set; }

然后调整ComboBox列设置:

  • 将DataPropertyName改为EplfColorId(对应实体的int类型ID属性)
  • 确保ValueMember = "eplfColorId"、DisplayMember = "eplfColorName"
  • 刷新时统一用BindingSource加载颜色列表:
private void RefreshDGV()
{
    eplfColorBindingSource.DataSource = SitacController.GetEplfColor();
    this.DGV_SITAC.DataSource = SitacController.GetAllSitac();
}

方案2:直接绑定EplfColor对象

如果要保留实体中的EplfColor对象属性,修改ComboBox列配置:

  1. 移除ValueMember的设置(或将其设为空)
  2. 保留DisplayMember = "eplfColorName"
  3. 确保eplfColorBindingSource的数据源是颜色列表:
eplfColorBindingSource.DataSource = SitacController.GetEplfColor();
  1. 刷新DataGridView时保持先加载ComboBox数据源、再加载主列表的顺序(同方案1的RefreshDGV代码)

额外检查:确认DataGridView的编辑模式允许修改,可查看DGV_SITAC.EditMode是否为DataGridViewEditMode.EditOnKeystrokeOrF2(默认值)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 09:58:12