【问题标题】:Cell Edits to SpreadsheetGear WorkbookView aren't persisting对 SpreadsheetGear WorkbookView 的单元格编辑不会持续存在
【发布时间】:2013-02-03 09:22:22
【问题描述】:

出了什么问题:

当我在 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 控件,现在似乎是由于验证处理程序所致。

【问题讨论】:

    标签: winforms model-view-controller spreadsheetgear controlcollection


    【解决方案1】:

    显然 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-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-19
      • 2019-09-16
      • 2015-02-10
      • 2019-08-24
      • 1970-01-01
      相关资源
      最近更新 更多