データバインドされたテキストボックスのテキストを更新してからボーダースタイルを変更すると、新しいテキスト値が上書きされるという点で、Windows フォームで独特の動作を見つけて再現することができました。
再現するには: 新しいフォームを作成し、3 つの TextBox コントロールを追加して、次のコードを使用します。
Public Class Form1
Private Class SampleObject
Public Property MyText As String = String.Empty
End Class
Private _sampleObject1 As New SampleObject With {.MyText = "Old Text 1"}
Private _sampleObject2 As New SampleObject With {.MyText = "Old Text 2"}
Private _sampleObject3 As New SampleObject With {.MyText = "Old Text 3"}
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
TextBox1.DataBindings.Add(New Binding("Text", _sampleObject1, "MyText", True, DataSourceUpdateMode.OnValidation, String.Empty))
TextBox2.DataBindings.Add(New Binding("Text", _sampleObject2, "MyText", True, DataSourceUpdateMode.OnValidation, String.Empty))
TextBox3.DataBindings.Add(New Binding("Text", _sampleObject3, "MyText", True, DataSourceUpdateMode.OnValidation, String.Empty))
TextBox1.Text = "New Text 1"
TextBox2.Text = "New Text 2"
TextBox3.Text = "New Text 3"
'Application.DoEvents() '<- won't fix this.
'TextBox2.Invalidate() '<- won't fix this.
'TextBox2.Update() '<- won't fix this.
'TextBox2.Refresh() '<- won't fix this.
TextBox1.BorderStyle = BorderStyle.Fixed3D
TextBox2.BorderStyle = BorderStyle.FixedSingle
TextBox3.BorderStyle = BorderStyle.None
End Sub
End Class
このアプリケーションを実行すると、3 つのテキストボックスを持つフォームが表示されます。最初のものは、境界線のスタイルが変更されていないため、新しいテキスト値を表示します。他の 2 つのテキスト ボックスには、古い値が表示されます。
私は次の観察を行いました:
- Form1_Load の先頭で最初のテキスト ボックスの BorderStyle を別のものに変更すると、新しい値ではなく元の値も表示されます。
- コメントアウトされた行は、コメント化されていない場合、問題を修正しません。
- 境界線スタイルの変更後にテキストの割り当てを移動すると、これは修正されますが、この例は Form クラスの継承を使用するより複雑なアプリケーションの単純化されたバージョンです。
- データバインディングをコメントアウトすることもこれを修正しますが、実行可能なオプションではありません。
- フォームに新しいテキスト ボックスを配置し、フォーカスを取得する最初のコントロールに設定しても、観察された動作は変わりません。
_sampleObjectN.MyText
の代わりにテキスト値を設定TextBoxN.Text
すると動作が逆になり、境界線が変更されていないテキスト ボックスには古い値が表示され、他の 2 つのテキスト ボックスには新しい値が表示されます。- DataSourceUpdateMode を に変更する
DataSourceUpdateMode.OnPropertyChanged
と、これは修正されますが、バインディングの動作も変更されます。
明らかな修正は、BorderStyle が変更された後に割り当てられるようにテキストの割り当てを変更するか、DataSourceUpdateMode を変更することですが、私の質問は、そもそもなぜこれが起こっているのですか?
更新:同僚の要求で、フォームにボタンを追加し、そのClick
イベントを変更してコントロールの境界スタイルを設定し、境界スタイルのコードをコメントアウトしましたForm_Load
。アプリケーションを実行すると、予想どおり、テキスト ボックスに新しい値が表示されますが、ボタンをクリックすると、テキスト ボックス 2 と 3 の境界線が変わり、それらのテキスト値が元の値に戻ります!