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

C# 如何强制网格在发生更改时立即将值传播到数据源?,c#,winforms,binding,devexpress,xtragrid,C#,Winforms,Binding,Devexpress,Xtragrid,我有一个DevExpress的XtraGrid,它绑定到一组对象。我希望更改在发生更改时立即进入底层数据源。但是默认的DevExpress行为是仅当用户离开单元格时才将新值放入数据源。因此,默认情况下,当用户在单元格中键入“Hello world”时,数据源将一次性接收整个句子。但我希望它能接受“H”、“He”、“Hel”等等 我试图在CellValueChangeing事件处理程序中调用PostEditor(),但没有任何帮助。还有其他想法吗?我认为CellValueChangeing是要捕获

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


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

我认为CellValueChangeing是要捕获的事件,但不是
PostEditor()
尝试
UpdateCurrentRow()。
网格的就地编辑器提供最终用户在编辑器中键入或以某种方式更改其值时发生的事件。您可以处理此事件以将当前编辑的值发布到数据源。
因此,我建议您使用以下方法:

    //...
    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();
}
视图的CellValueChangeing事件处理程序中的此代码解决了以下问题:

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

谢谢但是没有帮助。。只有当我离开单元格时,相同的行为-值才会进入数据源。我应该说这是错误的解决方案,可能会导致多个问题(例如,您已经终止了编辑器的验证,并且还丢失了编辑器的光标位置)。如果单元格编辑器是文本编辑器,则无法工作,因为SetFocusedRowCellValue将始终重置光标位置。当编辑器关闭时调用HiddenEditor事件,因此gridView.ActiveEditor为空。是否可以处理其他事件来删除EditValueChanged处理程序?@Yuyo您可以将gridView.ActiveEditor值存储到ShownEditor事件中的字段变量中,然后使用此值取消订阅(我已相应地更新了答案)。