Data binding 绑定到数据表的DefaultView的DevExpress VerticalGrid
背景: 我在未绑定模式下使用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: [
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;