布尔属性在运行时返回false,尽管设置为" true"通过设计师

时间:2017-08-03 18:09:06

标签: vb.net winforms

希望这有一个简单的解决方法:

我为我的解决方案创建了一个自定义文本框。对于该自定义控件,我添加了一个名为" AllowEmpty":

的自动属性
Public Property AllowEmpty As Boolean

我的构造函数和事件都读取了该属性的值并采取相应的行动:

Public Sub New()

    If AllowEmpty Then
        Text = String.Empty
    Else
        Text = "0"
    End If

End Sub

Private Sub CustomTextBox_TextChanged(sender As Object, e As EventArgs) Handles Me.TextChanged

    If AllowEmpty Then
        Text = String.Empty
    Else
        Text = "0"
    End If

End Sub

然而,通过设置断点,我看到如果我设置" AllowEmpty"在Designer上为True,它在运行时仍然是假的。我错过了什么吗?

感谢。

1 个答案:

答案 0 :(得分:4)

如果尝试在组件的构造函数中访问设计时自定义属性,那么事情发生的顺序对您不利。

假设此CustomTextBox位于Form1上,则会发生以下情况:

  1. Form1构造函数
  2. Form1构造函数调用Form1.InitializeComponent()
  3. Inside InitializeComponent,Me.components = New System.ComponentModel.Container()
  4. 现在构建CustomTextBox
  5. 返回Form1.InitializeComponent()
  6. 然后在InitializeComponent()

    中使用此代码
    'CustomTextBox1
    '
    Me.CustomTextBox1.AllowEmpty = True ' <--- that is the designer set value
    Me.CustomTextBox1.Location = New System.Drawing.Point(12, 12)
    Me.CustomTextBox1.Name = "CustomTextBox1"
    Me.CustomTextBox1.Size = New System.Drawing.Size(100, 20)
    Me.CustomTextBox1.TabIndex = 0
    ' ...
    

    如您所见,任何设计器集属性都在此处的代码中设置,构造类之后。所以构造函数不是访问它们的最佳位置。

    但您可以使用OnCreateControl

    Protected Overrides Sub OnCreateControl()
        MyBase.OnCreateControl()
        If AllowEmpty Then
            Text = String.Empty
        Else
            Text = "0"
        End If
    End Sub