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

本文关键字:值传 传播 数据源 网格 何强制 | 更新日期: 2023-09-27 18:28:45

我有一个DevExpress的XtraGrid,它绑定到一个对象集合。我希望在发生更改时立即将更改转移到底层数据源中。但DevExpress的默认行为是,只有当用户离开单元格时,才将新值放入数据源。因此,默认情况下,当用户在单元格中键入"Hello world"时,数据源将一次性接收整句话。但我想让它接收"H"、"He"、"Hel"等等

我试图在CellValueChanging事件处理程序中调用PostEditor(),但没有帮助。还有其他想法吗?

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

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();
}

我认为CellValueChanging是一个陷阱事件,但不要尝试PostEditor(),而是尝试UpdateCurrentRow().

视图的CellValueChanging事件处理程序中的这段代码解决了问题:

    private void OnCellValueChanging(object sender, CellValueChangedEventArgs e)
    {
        _gridView.SetFocusedRowCellValue(_gridView.FocusedColumn, e.Value);
    }