【问题标题】:Databound Windows Forms control does not recognize change until losing focus数据绑定 Windows 窗体控件在失去焦点之前无法识别更改
【发布时间】:2009-06-29 19:36:21
【问题描述】:

我使用数据绑定在 C# Windows 窗体客户端的文本框中显示值。当用户单击保存时,我将更改保存到数据库中。但是,活动编辑器中的新值将被忽略(保存先前的值)。如果我退出活动编辑器,然后保存,则新值将按预期保留。

有没有办法强制激活控件在持久化之前接受它的值?

【问题讨论】:

    标签: c# winforms data-binding


    【解决方案1】:

    如果您可以获取与输入(TextBox)对应的Binding 实例,则可以调用WriteValue method 将值从控件强制传递给它所绑定的对象。

    此外,您可以在BindingManagerBase class(通常是CurrencyManager class 实例)上调用EndCurrentEdit method 来完成编辑,但这需要在绑定的对象上实现ICancelAddNewIEditableObject 接口到(并且不需要您为绑定而钓鱼)。

    【讨论】:

      【解决方案2】:

      我使用的解决方案是在实际保存数据库记录之前,从 Save 事件(调用)中调用 Form 上的 ValidateChildren。这会强制验证所有字段并因此进行绑定,而不会失去当前在表单上编辑的控件的焦点。如果保存按钮位于 Windows 菜单系统上而不是窗体本身,这将非常方便 - 此外,如果窗体上的任何控件中的数据无效,它会返回 False,因此可用于防止保存错误数据。

      这也解决了当OnPropertyChanged 用作绑定方法而不是OnValidation 时发生的绑定字段的不一致更新。此外,如果将绑定方法设置为 Never 并为每个控件捕获的每个已验证事件进行单独的 WriteValue 调用,这一点也很重要。

      【讨论】:

        【解决方案3】:

        这是一种 hack,但在调用 save 之前,请尝试在按钮事件中将焦点从活动编辑器中移开(通过将焦点设置为其他内容,例如保存按钮)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多