DataSourceUpdateMode = Neverを設定してバインディングデータソースの自動更新をオフにしてから、ボタンを使用してロット全体を更新すると(binding.WriteValueを使用)、問題が発生します。つまり、最初のバインドされたコントロールのデータソースのみが更新されます。他のすべてのコントロールは元の値にリセットされます。
これは、現在のオブジェクトが変更されたときに(上記のWriteValueの後に発生するように)、ControlUpdateMode = OnPropertyChangeの場合、他のすべてのコントロールがデータソースから値を再読み込みするためです。
この問題を回避するための標準的な方法は何ですか?
1つの方法は、BindingSourceからクラスを派生させ、WriteAllValuesメソッドを追加することです。このメソッドは次のことを行います。
(1)バインディングごとに、ControlUpdateModeを保存します
(2)バインディングごとに、ControlUpdateMode=Neverを設定します
(3)バインディングごとに、WriteValueメソッドを呼び出します
(4)バインディングごとに、ControlUpdateModeを保存された値にリセットします
(5)バインディングごとに、ControlUpdateMode = OnPropertyChangeの場合、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が呼び出されると、すべてのCurrentItemChangedイベントが、同じBindingSource内の他のすべてのコントロールに対して呼び出されます。ただし、ControlDoingExplicitUpdateが設定されているため、更新を行ったコントロールでない限り、データソースから値を再読み込みすることはありません。これらのイベントがすべて完了した後、ControlDoingExplicitUpdateはNothingに設定されるため、通常のサービスが再開されます。
私はあなたがこれに従うことができることを願っています、そして-もう一度-私は尋ねます、あなたはこれに関する何か問題を見ることができますか?