【问题标题】:Boolean property returns false at runtime despite being set to "true" via Designer布尔属性在运行时返回 false,尽管通过 Designer 设置为“true”
【发布时间】:2017-08-03 18:09:05
【问题描述】:

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

我为我的解决方案创建了一个自定义文本框。我向那个自定义控件添加了一个名为“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

但是,通过设置断点,我发现如果我在 Designer 上将“AllowEmpty”设置为 True,它在运行时仍然为 false。我错过了什么吗?

谢谢。

【问题讨论】:

  • 尝试直接在自动实现的属性中设置默认值:Public Property AllowEmpty As Boolean = True
  • @AlexB。我不太明白为什么,但是在将代码更改为以下答案中的确切建议并将所有内容重新执行为 True(以及一些控件为 False)之后再次转到设计器,它最终按预期工作,但不是在施工时,即使在“真”和“0”出现的情况下,我也得到“假”。我不希望这种情况发生,你知道解决方法吗?
  • 我猜是因为在设计器中设置的属性值没有在构造函数中初始化,而是在可覆盖的方法中初始化。请检查InitializeNewComponent是否正确。
  • 它们由容器的设计者初始化。但是容器在构造之前不能设置控件的属性。似乎是鸡/蛋的情况。我认为不可能在构造函数中访问它们。

标签: vb.net winforms


【解决方案1】:

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

假设这个 CustomTextBox 在 Form1 上,会发生以下情况:

  1. Form1 构造函数
  2. Form1 构造函数调用Form1.InitializeComponent()
  3. InitializeComponent 内部,Me.components = New System.ComponentModel.Container()
  4. CustomTextBox 现已构建
  5. 返回Form1.InitializeComponent()

然后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

【讨论】:

  • 原来是正常定义的。显然,通过像这样在 Set 上明确放置括号并重新执行 Designer 上的所有控件,这已得到修复,但是当构造函数运行时它仍然返回 false,显然是因为控件尚不存在,导致“0”即使 True 也会显示。我怎样才能避免这种情况?
  • 我爱你!您不仅出色地回答了这个问题,而且为我提供了我不知道的这个有用事件的知识,如果我使用它而不是其他方法,我可以看到自己在最近编写的代码中遇到的麻烦要少得多。非常感谢。
  • 如果你有多个属性,并且在设置完所有属性后需要发生一些事情,ISupportIntialize 是一个接口,它在 ctor 和所有属性设置后调用方法 @Renato
  • @Plutonix 您能否提供一个基本的用法示例(文档除外)?这样我学得更好。谢谢
猜你喜欢
  • 2020-06-23
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多