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列配置:
- 移除
ValueMember的设置(或将其设为空) - 保留
DisplayMember = "eplfColorName" - 确保
eplfColorBindingSource的数据源是颜色列表:
eplfColorBindingSource.DataSource = SitacController.GetEplfColor();
- 刷新DataGridView时保持先加载ComboBox数据源、再加载主列表的顺序(同方案1的RefreshDGV代码)
额外检查:确认DataGridView的编辑模式允许修改,可查看DGV_SITAC.EditMode是否为DataGridViewEditMode.EditOnKeystrokeOrF2(默认值)。
内容的提问来源于stack exchange,提问作者Le_Fossoyeur
相关产品推荐
相关产品推荐

