设置数据绑定TextBox控件的BorderStyle会覆盖新的Text值

时间:2012-06-26 21:06:29

标签: vb.net winforms data-binding textbox border

我发现并且能够在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

运行此应用程序将为您提供一个包含三个文本框的表单。第一个将显示新的文本值,因为其边框样式未更改。其他两个文本框将显示其旧值。

The results as described above.

我做了以下观察:

  1. 将第一个文本框的BorderStyle更改为Form1_Load开头的其他内容将导致它也显示原始值而不是新值。
  2. 如果取消注释,则没有任何已注释掉的行可以解决问题。
  3. 在边框样式更改之后将文本分配移动到了这一点,但此示例是使用Form类继承的更复杂应用程序的简化版本。
  4. 注释掉数据绑定也会纠正这个问题,但这不是一个可行的选择。
  5. 在表单上放置一个新文本框并将其设置为第一个获得焦点的控件不会改变观察到的行为。
  6. 设置_sampleObjectN.MyText而不是TextBoxN.Text的文本值可以反转行为,以便没有边框更改的文本框显示旧值,其他两个显示新值。
  7. 将DataSourceUpdateMode更改为DataSourceUpdateMode.OnPropertyChanged将更正此问题,但也会更改绑定的行为。
  8. 明显的修复方法是更改​​文本分配,以便在更改BorderStyle之后分配它或更改DataSourceUpdateMode,但我的问题是:为什么这首先发生?

    更新:根据同事的要求,我在表单中添加了一个按钮,并更改了其Click事件以设置控件的边框类型,注释掉Form_Load中的边框样式代码。当应用程序运行时,我会按预期在文本框中看到新值,但是当我单击按钮时,文本框2和3上的边框会发生变化,并且它们的文本值将恢复为旧值!

0 个答案:

没有答案