如何强制网格在更改时立即将值传播到数据源?

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 将始终重置光标位置。

以上是关于如何强制网格在更改时立即将值传播到数据源?的主要内容,如果未能解决你的问题,请参考以下文章

即使没有更新数据,如何强制 Kendo 网格更新

将值更新到 AG 网格中的服务器

以编程方式将新行添加到数据网格视图

如何强制我的 C# 应用程序立即确认 TCP 数据报?

MS Access - 更改表单中的值后立即写入表

dojo datagrid 1.7 在存储更改时自动更新