对SpreadsheetGear WorkbookView的单元格编辑不会持久化

时间:2013-02-18 20:39:12

标签: winforms model-view-controller spreadsheetgear controlcollection

出了什么问题:

当我在SpreadsheetGear WorkbookView中编辑单元格并通过按Enter键,Tab键或任何箭头键来启动CellEndEdit事件时,我刚刚输入的值就会被删除。

上下文:

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

问题:

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

如果我能在任何地方详细说明或更好地解释自己,请告诉我,谢谢!

更新

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

1 个答案:

答案 0 :(得分:0)

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

声明如下:

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

我将语句更改为如下所示:

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

这解决了这个问题,因为如果输入的数据是用户定义的,则用户正在键入数据,而这个if语句允许视图保留该数据,直到基本上整个页面验证之后。仍然在callstack上是模型的更新,特别是这个Data属性。

对不起,这可能不会给一般人提供太多帮助,因为这是个人实施的问题。但是我仍然认为值得注意的是,如果你将一个主要的更新绑定到验证处理程序,那么类似的东西必然会在未来发生越来越多的更新声明。