.net – 使用WriteValue进行手动数据绑定
如果我通过设置DataSourceUpdateMode = Never来关闭绑定数据源的自动更新,然后使用按钮来更新整个批次(使用binding.WriteValue),则会出现问题 – 即,只更新第一个绑定控件的数据源.所有其他控件将重置为原始值.
这是因为当当前对象发生更改时(如上面的WriteValue之后),如果ControlUpdateMode = OnPropertyChange,则所有其他控件都会重新读取数据源中的值. 避免这个问题的标准方法是什么? 一种方法是从BindingSource派生一个类并添加一个WriteAllValues方法. (1)对于每个Binding,保存ControlUpdateMode (2)对于每个Binding,设置ControlUpdateMode = Never (3)对于每个Binding,调用WriteValue方法 (4)对于每个Binding,将ControlUpdateMode重置为保存的值 (5)对于每个Binding,则调用ReadValue方法. 你能看到这样做有什么问题吗? 如果使用自己的类,实现IEditableObject会解决问题吗? 在我正在研究的另一个控件中,我实现了自己的绑定.我解决这个问题的方法是使用以下代码. (我已经把它放在最低限度,我希望你能遵循它!): 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,它们不会重新读取数据源中的值,除非它们恰好是执行更新的控件. 我希望你能遵循这个,并且 – 再次 – 我问,你能看到这个问题吗?
我对表单有类似的要求.在我的情况下,我只想在单击表单的“保存”按钮时发生所有表单控件的数据绑定.
我找到的最佳解决方案是将每个绑定的DataSourceUpdateMode设置为OnValidation,然后将包含表单的AutoValidate属性设置为Disable.当您在窗体上的控件之间更改焦点时,这可以防止绑定.然后在我的保存按钮的Click事件中,我手动验证我的表单的输入,如果没有,则调用表单的ValidateChildren方法来触发绑定. 此方法还具有使您可以完全控制验证输入的方法的优点.默认情况下,WinForms不包括一个很好的方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |