.net - 使用 WriteValue 手动绑定(bind)数据

标签 .net vb.net winforms data-binding bindingsource

如果我通过设置 DataSourceUpdateMode = Never 关闭绑定(bind)数据源的自动更新,然后使用按钮更新整个批处理(使用 binding.WriteValue),则会出现问题 - 即,仅更新第一个绑定(bind)控件的数据源。所有其他控件都重置为原始值。

这是因为当当前对象发生变化时(如上述WriteValue之后发生的情况),如果ControlUpdateMode = OnPropertyChange,那么所有其他控件都会重新从数据源中读取该值。

避免这个问题的标准方法是什么?

一种方法是从 BindingSource 派生一个类并添加一个 WriteAllValues 方法。
此方法执行以下操作:

(1)对于每个Binding,保存ControlUpdateMode

(2) 对于每个Binding,设置ControlUpdateMode = Never

(3) 对于每个Binding,调用WriteValue方法

(4) 对于每个 Binding,将 ControlUpdateMode 重置为保存的值

(5) 对于每个Binding,如果ControlUpdateMode = OnPropertyChange,调用ReadValue方法。

你能看出这样做有什么问题吗?

如果使用您自己的类,实现 IEditableObject 会解决问题吗?

在我正在处理的另一个控件中,我实现了自己的绑定(bind)。我解决这个问题的方法是使用以下代码。 (我已经做到了最低限度,希望你能遵守!):

Private Shared ControlDoingExplicitUpdate As MyCustomControl = Nothing

Private Sub UpdateDataSourceFromControl(ByVal item As Object, ByVal propertyName As String, ByVal value As Object)
  Dim p As PropertyDescriptor = Me.props(propertyName)
  Try
    ControlDoingExplicitUpdate = Me
    p.SetValue(item, value)
  Catch ex As Exception
    Throw
  Finally
    ControlDoingExplicitUpdate = Nothing
  End Try
End Sub

Private Sub DataBindingSource_CurrentItemChanged(ByVal sender As Object, ByVal e As System.EventArgs)
  If (ControlDoingExplicitUpdate IsNot Nothing) AndAlso (ControlDoingExplicitUpdate IsNot Me) Then Exit Sub
  Me.UpdateControlFromDataSource() 'Uses ReadValue
End Sub

因此,当调用 UpdateDataSourceFromControl 时,将为同一 BindingSource 中的所有其他控件调用所有 CurrentItemChanged 事件。但是,由于设置了 ControlDoingExplicitUpdate,它们不会从数据源重新读取值,除非它们恰好是进行更新的控件。
在所有这些事件完成后,ControlDoingExplicitUpdate 设置为 Nothing,以便恢复正常服务。

我希望你能关注这个,并且 - 再次 - 我问,你能看到这有什么问题吗?

最佳答案

我对表格有类似的要求。在我的情况下,我只希望在单击表单的“保存”按钮时发生所有表单控件的数据绑定(bind)。

我发现的最佳解决方案是将每个绑定(bind)的 DataSourceUpdateMode 设置为 OnValidation,然后将包含表单的 AutoValidate 属性设置为 Disable。当您在窗体上的控件之间更改焦点时,这可以防止绑定(bind)。然后在我的 Save 按钮的 Click 事件中,我手动验证表单的输入,如果没问题,调用表单的 ValidateChildren 方法来触发绑定(bind)。

此方法还具有让您完全控制如何验证输入的优势。默认情况下,WinForms 不包含执行此操作的好方法。

关于.net - 使用 WriteValue 手动绑定(bind)数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1638501/

相关文章:

vb.net - 根据单元格值的数量更改DataGridView中的行颜色

.net - 使用Shapes派生对象代替Visual派生对象造成的性能下降有多大

c# - 通过代码注册一个自定义的 PageHandlerFactory

.net - 如何正确使用 MSBuild 社区任务库在 .NET dll 上设置 SVN 版本号

c# - 将接口(interface)的事件从 VB.Net 转换为 C#

c# - 静态关键字、状态/实例变量和线程安全

asp.net - 如何在 Linux 服务器上托管的 Mono 中部署 .NET Web 应用程序?

c# - 为什么我的自定义控件的文本属性不会显示在“属性”窗口中?

c# - 将右键单击发送到窗口

c# - 国际化 HelloWorld 程序 .NET