我发现并且能够在Windows窗体中重现一种奇特的行为,因为更新数据绑定文本框中的文本然后更改bordertyle将覆盖新的文本值。
要重现:创建一个新表单,添加三个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
运行此应用程序将为您提供一个包含三个文本框的表单。第一个将显示新的文本值,因为其边框样式未更改。其他两个文本框将显示其旧值。
我做了以下观察:
_sampleObjectN.MyText
而不是TextBoxN.Text
的文本值可以反转行为,以便没有边框更改的文本框显示旧值,其他两个显示新值。DataSourceUpdateMode.OnPropertyChanged
将更正此问题,但也会更改绑定的行为。明显的修复方法是更改文本分配,以便在更改BorderStyle之后分配它或更改DataSourceUpdateMode,但我的问题是:为什么这首先发生?
更新:根据同事的要求,我在表单中添加了一个按钮,并更改了其Click
事件以设置控件的边框类型,注释掉Form_Load
中的边框样式代码。当应用程序运行时,我会按预期在文本框中看到新值,但是当我单击按钮时,文本框2和3上的边框会发生变化,并且它们的文本值将恢复为旧值!