2

有 2 个不同的 UI 概念:CellValueChanging 与 CellValueChanged。

引自 DevExpress 文档:

每次更改编辑的值(用户键入或删除字符,从下拉列表中选择值等)时都会引发 CellValueChanging 事件。

另一方面,当用户通过按回车键或单击活动单元格外部完成单元格编辑时,会引发 CellValueChanged。

现在我的问题是,我有一个组合框类型列,我想总是跳过 CellValueChanging 并进行最终更改。当前的行为是当用户从组合框中选择一个项目时,更改不会立即生效(例如,视图不会根据更改而恢复)。在用户按 Enter 键或单击单元格外部之前,不接受更改。

---------------07/26/2013 2:25PM update---------------
抱歉我之前的问题描述误导了大家,所以我会改写的。

这是当前的行为:

Pic1:开始状态。行按目标的字母顺序排序。
在此处输入图像描述

Pic2:将第二行值从 B 更改为 D
在此处输入图像描述

图3:鼠标左键单击项目D后,下拉菜单消失,单元格值变为D。但是,行没有被重新排序
在此处输入图像描述

图 4:在单元格外部单击或按 Enter 后,行将被重新排序。
在此处输入图像描述

我想要实现的是跳过 Pic3 中的步骤。换句话说,我希望立即提交任何更改,而无需进行额外的记事本或鼠标点击。

我在这里展示的是我的应用程序的简化示例。我无法将 CellValueChanged 事件处理程序逻辑移动到 CellValueChanging 或 EditValueChanged,因为它会导致一些错误。

4

2 回答 2

1

如果您想捕捉最终用户在gridview 的单元格编辑器中更改某些值的时刻(例如,在组合框中选择项目),请处理相应RepositoryItem 的EditValueChanged 事件。要立即发布此值(使更改最终化),您需要调用相应容器的PostEditor 方法:

repositoryItemComboBox1.EditValueChanged += repositoryItemComboBox1_EditValueChanged;
//...
void repositoryItemComboBox1_EditValueChanged(object sender, EventArgs e) {
    gridView1.PostEditor();
    // do something else if it needed
}

相关示例:E3234 - 如何在就地编辑器的值更改后立即更新行的样式

于 2013-07-26T06:07:34.833 回答
1

一旦用户编辑单元格值,您想进行一些 UI 更改,对吗?我认为通常你必须放弃处理 CellValueChanged 事件,而是使用 CellValueChanging 事件:

伪代码:

HandleCellValueChanging(object sender, CellValueChangingEventArgs e) 
{
   // Get underlying object
   // and write the value direct into the object
   var rowObj = (YourType)gridview.GetRow(gridView.FocusedRowHandle);
   rowObj.TargetField = e.NewValue; // e.Value or e.NewValue, not sure

   // Then Do your UI effect
}

另一种选择是使用 RepositoryItemEditor 并处理key-up和/或Mouse-up事件。

于 2013-07-26T05:29:06.467 回答