正确引用类的继承属性的方法?

时间:2016-11-12 19:04:55

标签: vb.net class inheritance properties

我很肯定这是非常简单的事情,但我已经完全冻结了脑袋。

我正在尝试创建自己的控件,它会为文本框添加一些特定功能,并最终希望此控件在我的工具箱中可用,以便在整个项目中使用。

作为一个例子,我想将这个新控件添加到我的表单中,将.Text属性更改为" Something"然后在New()子中的.Text属性上执行一些逻辑,但是me.text总是返回"",这意味着我的逻辑失败。

Public Class Class1
    Inherits Windows.Forms.TextBox

    Public Sub New()
        If Me.Text = "Something" Then
            MessageBox.Show("Do something")
        End If
    End Sub
End Class

关于如何克服这个障碍的任何建议?

提前致谢。

续...

好的,所以我认为这里有更多的背景。

这是我想尝试的,让我自己回到OOP,因为我认为(!)这将是一个简单的起点。

我确定有一个我可以下载的课程可以完成我需要的一切,但我想学习,而不仅仅是从我找到的地方复制/编码代码。

所以,目标是有一个文本框,它也会提供一个"标题"属性。此属性将包含在文本框中显示的文本,直到它被单击,即"您的姓名",然后您单击然后输入您的姓名(基本内容)。

发布的原始代码试图证明我在New()方法中获取.Text属性值时遇到的问题,因为这是我尝试在.text和Caption之间进行一些比较的地方。代码现在已经改变了,我不再这样做了。

我目前遇到的主要问题是......当我将控件添加到Windows窗体时,文本框(.text)为空,我希望它用字幕填充。

下面发布的代码是我经过多次试验和错误的地方。它不是太漂亮了,还有一些事情需要更详细地考虑,但最终我的当前问题是将.text属性填充到我想要的东西并在设计器中显示。

Public Class TextBoxWithCaption
    Inherits Windows.Forms.TextBox

    Dim Caption_Text As String = "Caption"                               ' Define default caption property value
    Dim Caption_TextForeColor As Color = SystemColors.ControlDarkDark

    Dim NoCaption_TextForeColor As Color = SystemColors.WindowText

    Public Sub New()

        MyBase.New()
        Me.Text = Caption
        Me.Width = 150
        Me.ForeColor = Caption_TextForeColor
    End Sub

    Property Caption() As String
        Get
            Return Caption_Text
        End Get
        Set(value As String)

            ' Caption has been changed.
            '

            If Me.Text = Caption_Text Or String.IsNullOrEmpty(Me.Text) Then
                ' Caption property has changed, textbox has no user defined value, update the textbox with the new caption
                Me.Text = value
            End If

            Caption_Text = value

        End Set

    End Property


    Private Sub TextBoxWithCaption_GotFocus(sender As Object, e As EventArgs) Handles Me.GotFocus

        If Me.Text = Caption Then
            ' If the caption is displayed, then clear it ready for the user to type
            Me.Text = ""
            Me.ForeColor = NoCaption_TextForeColor
        End If
    End Sub


    Private Sub TextBoxWithCaption_LostFocus(sender As Object, e As EventArgs) Handles Me.LostFocus

        If Me.Text = "" Then
            ' If the user has not typed anything, restore the caption
            Me.Text = Caption
            Me.ForeColor = Caption_TextForeColor
        End If
    End Sub

End Class

2 个答案:

答案 0 :(得分:1)

Text属性的初始值将始终为空字符串。

通过设计器更改属性时,构造函数将始终被称为 previous 以更改属性。这是因为必须先创建控件才能修改它。修改尚未初始化的Text变量的Class1属性将抛出NullReferenceException

如果您在.Designer.vb方法中查看表单的InitializeComponent()文件,它将如下所示:

Private Sub InitializeComponent()
    Me.components = New System.ComponentModel.Container()
    Me.Class11 = New YourNamespace.Class1()
    Me.SuspendLayout()
    '
    'Class11
    '
    Me.Class11.Text = "Something"

    ...
End Sub

简而言之:除非你将值立即传递给构造函数,否则你所做的事情是不可能的。

答案 1 :(得分:1)

你仍然可以这样做,这是正确的方法,因为你想在底层类型上调用构造函数

Public Sub New()
    MyBase.New() '<-- this will init yout base text box and now you can use it

    Me.Text = "Something" 

End Sub

但是如果你有像Resharper这样的工具,它会警告你在构造函数&#34;中的虚拟成员调用,这可能会对你的属性产生意想不到的结果。你可以在网上看到。要解决此问题,请添加此属性

Public Overrides NotOverridable Property Text As String
    Get
        Return MyBase.Text
    End Get
    Set (value as string)
        MyBase.Text = value
    End Set
End Property