2012-03-22 43 views
3

我有一个绑定到对象集合的DevExpress'XtraGrid。我希望在更改时立即进入底层数据源。但默认的DevExpress行为仅在用户离开单元格时才将新值添加到数据源中。因此,默认情况下,当用户在单元格中输入“Hello world”时,数据源将一次接收整个句子。但我希望它能得到“H”,“他”,“Hel”等。如何强制网格在变更时立即将值传递给数据源?

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

回答

0

此代码视图的CellValueChanging事件处理程序解决的问题:

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

我应该说,这是错误的解决方案,可以引入多个问题(例如,你已经终止了编辑器的验证,并且也丢失了编辑器的光标位置) – DmitryG 2012-03-23 20:35:58

+0

如果单元格编辑器是文本编辑器,它不起作用,因为SetFocussedRowCellValue将始终重置光标位置。 – Adiono 2014-11-30 02:54:17

2

我觉得CellValueChanging是事件捕获但不是PostEditor()尝试UpdateCurrentRow().

+0

谢谢!虽然没有帮助..只有当我离开单元格时,相同的行为 - 值才进入数据源。 – Dmitry 2012-03-22 16:35:01

9

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

编辑器关闭时调用HiddenEditor事件,因此gridView.ActiveEditor为null。是否有可以处理的另一个事件来删除EditValueChanged处理程序? – Yuyo 2014-07-24 15:50:17

+0

@Yuyo无论如何,您可以将GridView.ActiveEditor值存储到ShownEditor事件中的字段变量中,然后使用该值来取消订阅(我相应地更新了我的答案)。 – DmitryG 2014-07-28 04:57:27