0

出了什么问题:

当我在 SpreadsheetGear WorkbookView 中编辑一个单元格并通过按 Enter、Tab 或任何箭头键启动 CellEndEdit 事件时,我刚刚键入的值将被清除。

语境:

  • 似乎在 WorkbookView 中编辑单元格时,会在 WorkbookView 顶部添加一个控件,该控件的行为类似于 TextEdit,以允许您键入数据。当发生 CellEndEdit 事件时,调用堆栈指示 WorkbookView 调用 ControlCollection.Remove(...)。
  • 这反过来又会导致表单将焦点放在页面上的另一个控件上。有问题的页面包括 WorkbookView 上方的一些 TextEdit 控件,这些控件是从基本页面继承的。第一个 TextEdit 会在短时间内获得焦点。
  • 在这些 TextEdits 上设置验证,最终启动模型更新。这会清除 WorkbookView 中的内容,因为所有这些都发生在视图更改被推送到模型之前。

问题:

在我的 WorkbookViews 事件处理程序可以将视图的更改推送到模型之前,有没有办法阻止其他控件接收焦点?还是有其他方法可以更好地处理这个问题?

请让我知道我是否可以在任何地方详细说明或更好地解释自己,谢谢!

更新:

我用一个 DevExpress TextEdit 和一个 SpreadsheetGear WorkbookView 创建了一个测试应用程序。如果我添加 textEdit1_Validated 和 textEdit1_Enter,我会得到相同的行为。焦点转到 TextEdit 控件,现在似乎是由于验证处理程序。

4

1 回答 1

0

显然 DevExpress TextEdit 控件的验证处理程序请求焦点,这是模型更新期间运行的语句之一的问题。SpreadsheetGear WorkbookView 中数据的视图属性被设置为该属性的模型版本,并且模型可以具有默认值或用户定义的值。

声明是这样写的:

view.Data = model.IsUserDefined ? model.Data.UserDefined : model.Data.Default

我将声明更改为如下内容:

if (!model.IsUserDefined)
{
    view.Data = model.Data.Default;
}

这解决了这个问题,因为如果输入的数据是用户定义的,则用户正在输入数据,并且这个 if 语句允许视图保留该数据,直到基本上整个页面验证之后。仍在调用堆栈上的是专门针对此 Data 属性的模型更新。

很抱歉,这可能不会对一般人提供太多帮助,因为这是个人实施的问题。但我仍然认为值得注意的是,如果您将主要更新与验证处理程序联系起来,那么随着越来越多的附加更新语句,这样的事情肯定会在以后发生。

于 2013-02-19T21:52:17.040 回答