VB.NET中DevExpress DataGrid自定义列无法保存输入值的问题求助
我之前在使用DevExpress DataGrid时也碰到过完全一样的问题——手动添加的列输入内容后切单元格就消失,数据源加载的列却正常。大概率是这几个常见原因,你可以挨个排查:
1. 手动列没正确绑定到数据源字段
这是最最常见的问题!你通过设计器加的AccountID和GridColumn1列,如果没绑定到数据源实体的对应属性,输入的值只是临时显示在编辑器里,单元格失去焦点后,DataGrid会重新从数据源拉取数据,自然就清空了。
解决步骤:
- 打开设计器,选中你手动创建的列
- 在属性面板里找到
FieldName,设置为数据源实体中对应的属性名(比如你的实体有AccountID属性,就填AccountID) - 如果是新增的字段,要确保你的数据源实体类里已经添加了这个属性,并且是
public的,同时有get和set方法
2. 编辑权限没开
别笑,真的很多人会漏这个!要同时检查两个地方:
- 单个列的编辑权限:选中列,找到
AllowEditing属性,确保设为True(代码里写的话就是colAccountID.AllowEditing = true;) - GridView全局编辑开关:找到GridView的
OptionsBehavior.Editable,必须设为True,否则整个Grid都不能编辑
3. 数据源集合不支持更新通知
如果你的数据源是普通的List<T>,而不是ObservableCollection<T>或者DevExpress自带的BindingList<T>,DataGrid可能无法感知到数据变化,导致输入的值没法保存到集合里。
解决:把数据源换成ObservableCollection<YourEntity>或者BindingList<YourEntity>,这样当你修改单元格值时,集合会自动通知DataGrid更新数据。
4. 实体类没实现INotifyPropertyChanged接口
如果你的实体类没有实现这个接口,当你修改单元格值时,数据源的属性变化无法通知DataGrid,导致Grid刷新时又显示旧值。
示例代码:
public class YourEntity : INotifyPropertyChanged { private int _accountID; public int AccountID { get => _accountID; set { if (_accountID != value) { _accountID = value; OnPropertyChanged(nameof(AccountID)); } } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
5. 编辑提交模式的问题
默认情况下,DevExpress可能需要手动触发提交(比如按Enter),如果切换单元格时没提交就会丢失内容。你可以调整GridView的编辑行为:
- 把
OptionsBehavior.EditorShowMode设为EditorShowMode.MouseDown,确保点击单元格就进入编辑状态 - 把
OptionsEditing.CancelOnLostFocus设为False,这样失去焦点时不会取消编辑
先从第1、2点开始排查,这两个解决了大部分情况。如果还不行,再看后面的点。
内容的提问来源于stack exchange,提问作者Dennis Liu
相关产品推荐
相关产品推荐

