无法获取公共属性在自定义类中工作

时间:2014-09-17 11:49:08

标签: vb.net properties

我创建了一个自定义类,模仿文本框控件,但允许我在此控件中嵌入一个按钮。一切正常。

然而我的问题是我正在尝试设置一个公共属性,允许我将此按钮显示为可见(实际创建它),但我似乎无法解决为什么我的属性永远不会设置为True - 意思因为我已经实现了这段代码,所以我的按钮不再被绘制了。

我有以下代码:

Public Class CustomTextbox
    Inherits TextBox

    Private m_EnableSearch As Boolean
    Private search_btn As Button

    Public Sub New()
        ' This call is required by the designer.
        Initialize()

    End Sub

    Private Sub Initialize()
        search_btn = Nothing

        'Draw the buttons
        If EnableSearchButton = True Then CreateSearchButton() '<== This never equals True
    End Sub

    Private Sub CreateSearchButton()
        search_btn = New Button()        
        ...
        ...
    End Sub

    <Category("Appearance")> _
<Description("Enables the search button")> _
    Public Property EnableSearchButton() As Boolean
        Get
            Return Me.m_EnableSearch
        End Get
        Set(value As Boolean)
            Me.m_EnableSearch = value
            Me.Invalidate()
        End Set
    End Property
End Class

如果我取消选中EnableSeachButton = True并将其更改为CreateSearchButton,则按钮会按预期显示。但是,即使我可以在设计视图中看到并更改EnableSearchButton属性,但当我单步执行代码时,它似乎永远不会成立。

感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

你的问题有点令人困惑。 EnableSearchButton实际上是向控件添加了一个按钮,还是意味着切换所述按钮的Enabled状态?要使按钮响应属性并切换启用状态,您需要设置按钮的状态:

Public Property EnableSearchButton() As Boolean
    Get
        Return Me.m_EnableSearch
    End Get
    Set(value As Boolean)
        Me.m_EnableSearch = value

        ' to create the button when the prop is set:
        If Value AndAlso search_btn IsNot Nothing Then
           ' create button
        End If

        If Value = False Then
            ' destroy button
        End If

        Me.Invalidate()
    End Set
End Property

由于您似乎是在运行时创建按钮,因此必须在没有任何内容的情况下添加检查。由于构造函数只运行一次并且在创建时,因此无需测试EnableSearchButton的状态,只需始终创建它。

如果你的Enabled属性实际上意味着像这个TB的AddButton,那么只需在ctor中传递一个布尔值:

 Public Sub New(boolAddButton As Boolean)
     If boolAddButton Then CreateSearchButton() 
 End Sub

您拥有它的方式,在创建控件时,后备字段m_EnableSearch将始终为true。您在IDE中执行的任何道具设置都会在 创建控件后发生,这是您设置控件以创建按钮的唯一位置。