C# DataGridView自定义EditingControl:如何将修改值同步至对应单元格?
DataGridView自定义EditingControl单元格值不更新的解决方法
核心问题原因
自定义编辑控件未正确实现IDataGridViewEditingControl接口的关键逻辑,导致DataGridView无法捕获编辑后的新值。
具体修复步骤
正确实现
IDataGridViewEditingControl接口核心成员
自定义控件必须完整实现该接口的以下关键部分:EditingControlFormattedValue属性:Getter返回控件当前编辑值(需匹配单元格预期格式),Setter将传入值解析后赋值给控件;EditingControlValueChanged属性:控件值变化时必须设为true,通知DataGridView值已更新;ApplyCellStyleToEditingControl方法:将单元格样式同步到编辑控件,保证视觉一致性。
绑定控件值变化事件,主动通知DataGridView
在自定义编辑控件的初始化逻辑中,绑定自身值变化事件(如TextBox的TextChanged、ComboBox的SelectedIndexChanged),事件触发时执行:EditingControlValueChanged = true; dataGridView?.NotifyCurrentCellDirty(true);自定义单元格类同步初始值到编辑控件
继承DataGridViewCell的自定义单元格类,重写InitializeEditingControl方法时,将单元格当前值同步到编辑控件:public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle) { base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle); var editingControl = DataGridView.EditingControl as YourCustomEditingControl; if (editingControl != null) { editingControl.Value = this.Value != null ? (YourValueType)this.Value : default; editingControl.OwningDataGridView = DataGridView; editingControl.OwningRow = DataGridView.Rows[rowIndex]; } }自定义列类关联正确单元格模板
继承DataGridViewColumn的自定义列类,构造函数中指定CellTemplate为自定义单元格实例:public class YourCustomColumn : DataGridViewColumn { public YourCustomColumn() { CellTemplate = new YourCustomCell(); } }
关键注意点
- 若自定义控件使用复杂数据类型,需确保
EditingControlFormattedValue能正确处理数据的格式化与解析,避免类型转换错误; - 不要忽略
IDataGridViewEditingControl接口的其他成员(如EditingControlRowIndex、RepositionEditingControlOnValueChange等),需按实际场景正确实现。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

