Data binding 绑定到数据表的DefaultView的DevExpress VerticalGrid

Data binding 绑定到数据表的DefaultView的DevExpress VerticalGrid,data-binding,ado.net,devexpress-windows-ui,Data Binding,Ado.net,Devexpress Windows Ui,背景: 我在未绑定模式下使用VerticalGrid已经有几年了,我使用自己的代码在编辑器和数据对象之间处理移动数据 现在我尝试在多记录布局模式下使用它 Name: [ ] Name: [ ] Name: [ ] Addr: [ ] Addr: [ ] Addr: [ ] City: [ ] City: [ ] City: [

背景: 我在未绑定模式下使用VerticalGrid已经有几年了,我使用自己的代码在编辑器和数据对象之间处理移动数据

现在我尝试在多记录布局模式下使用它

Name: [           ] Name: [           ] Name: [           ]
Addr: [           ] Addr: [           ] Addr: [           ]
City: [           ] City: [           ] City: [           ]
并将其绑定到System.Data.DataTable的DefaultView:

  vGridControl1.DataSource = myDataTable.DefaultView;
  vGridControl1.DataBindings.DefaultDataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged;  
但是,在编辑的记录失去焦点之前,不会将对记录的更改推送到DataView

问题:
有没有一种方法可以使网格进入一种模式,即当单元格编辑器失去焦点时,数据源会立即更新?例如,如果编辑了Name,并且用户移动到Addr,则数据源会立即反映更改?

您可以在ValidatingEditor事件中对此进行更改,如下所示:

private void vGridControl1_ValidatingEditor(object sender, DevExpress.XtraEditors.Controls.BaseContainerValidateEditorEventArgs e)
    {
        vGridControl1.UpdateFocusedRecord();
    }
以下内容将更新数据源中的字段明确性,而不尝试写入整个记录:

        private void vGridControl1_ValidatingEditor(object sender, DevExpress.XtraEditors.Controls.BaseContainerValidateEditorEventArgs e)
    {
        var list = vGridControl1.DataSource as IList;
        var record = list[vGridControl1.FocusedRecord] as DataRowView;
        record[vGridControl1.FocusedRow.Index] = e.Value;
    }

感谢您的建议,但是如果网格中后面的行对基础数据列具有
AllowNull=false
约束,则会发生冲突。这种
UpdateFocusedRecord()
方法将整个记录推送到数据源,而我只需要将当前编辑器的值推送到数据源中。我在答案后面附加了一个解决方案,该解决方案只更新数据源中的聚焦字段。谢谢,这给了我一些很好的帮助。vGridControl.FocusedRow返回正确的对象,但vGridControl.FocusedRow.Index返回0,这不是相关列的正确索引。但是,vGridControl1.FocusedRow.Properties.FieldName或..Properties.RowHandle可以让我在DataRowView中找到正确的位置;DataRowView drv=(vGridControl1.DataSource作为DataView)[recordindex];drv[vGridControl1.FocusedRow.Properties.FieldName]=e.Value;