如何强制网格在更改时立即将值传播到数据源?
Posted
技术标签:
【中文标题】如何强制网格在更改时立即将值传播到数据源?【英文标题】:How to force grid to propagate value to datasource immediately on change? 【发布时间】:2012-04-07 04:07:58 【问题描述】:我有一个绑定到对象集合的 DevExpress 的 XtraGrid。我希望更改在更改时立即进入底层数据源。但是默认的 DevExpress 行为是仅在用户离开单元格时才将新值放入数据源。因此,默认情况下,当用户在单元格中键入“Hello world”时,数据源将一次性接收整个句子。但我希望它接收“H”、“He”、“Hel”等。
我尝试在 CellValueChanging 事件处理程序中调用 PostEditor(),但没有帮助。还有其他想法吗?
【问题讨论】:
【参考方案1】:Grid 的就地编辑器提供EditValueChanged 事件,当最终用户在编辑器中键入或以某种方式更改其值时会发生该事件。您可以处理此事件以将当前编辑的值发布到数据源。 因此,我建议您使用以下方法:
//...
gridView.ShownEditor += gridView_ShownEditor;
gridView.HiddenEditor += gridView_HiddenEditor;
DevExpress.XtraEditors.BaseEdit gridViewActiveEditor;
void gridView_ShownEditor(object sender, EventArgs e)
gridViewActiveEditor = gridView.ActiveEditor;
gridViewActiveEditor.EditValueChanged += ActiveEditor_EditValueChanged;
void gridView_HiddenEditor(object sender, EventArgs e)
gridViewActiveEditor.EditValueChanged -= ActiveEditor_EditValueChanged;
void ActiveEditor_EditValueChanged(object sender, EventArgs e)
gridView.PostEditor();
【讨论】:
编辑器关闭时会调用 HiddenEditor 事件,因此 gridView.ActiveEditor 为空。是否可以处理其他事件以删除 EditValueChanged 处理程序? @Yuyo 您无论如何都可以将 gridView.ActiveEditor 值存储到 ShownEditor 事件中的字段变量中,然后使用该值取消订阅(我已相应地更新了我的答案)。【参考方案2】:我认为 CellValueChanging 是要捕获的事件,而不是 PostEditor()
尝试 UpdateCurrentRow().
【讨论】:
谢谢!但没有帮助..相同的行为 - 只有当我离开单元格时,值才会进入数据源。【参考方案3】:视图的 CellValueChanging 事件处理程序中的这段代码解决了这个问题:
private void OnCellValueChanging(object sender, CellValueChangedEventArgs e)
_gridView.SetFocusedRowCellValue(_gridView.FocusedColumn, e.Value);
【讨论】:
我应该说这是错误的解决方案,可能会引入多个问题(例如,您已经杀死了编辑器的验证,并且还丢失了编辑器的光标位置) 如果单元格编辑器是文本编辑器则不起作用,因为 SetFocusedRowCellValue 将始终重置光标位置。以上是关于如何强制网格在更改时立即将值传播到数据源?的主要内容,如果未能解决你的问题,请参考以下文章