Vb.net 引用类的正确方式';她继承的财产?

Vb.net 引用类的正确方式';她继承的财产?,vb.net,class,inheritance,properties,Vb.net,Class,Inheritance,Properties,我肯定这很简单,但我的大脑完全冻结了 我正在尝试创建我自己的控件,该控件将向文本框添加一些特定的功能,并最终希望该控件在我的工具箱中可用,以便在整个项目中使用 例如,我想将此新控件添加到表单中,将.Text属性更改为“Something”,然后对new()子项中的.Text属性执行一些逻辑,但是me.Text总是返回“”,这意味着我的逻辑失败 Public Class Class1 Inherits Windows.Forms.TextBox Public Sub New()

我肯定这很简单,但我的大脑完全冻结了

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

例如,我想将此新控件添加到表单中,将.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

文本
属性的初始值始终为空字符串

当通过设计器更改属性时,总是在更改属性之前调用构造函数。这是因为必须先创建控件,然后才能修改它。修改尚未初始化的
Class1
变量的
Text
属性将引发一个错误

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

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

    ...
End Sub

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

文本属性的初始值将始终是空字符串

当通过设计器更改属性时,总是在更改属性之前调用构造函数。这是因为必须先创建控件,然后才能修改它。修改尚未初始化的
Class1
变量的
Text
属性将引发一个错误

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

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

    ...
End Sub

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

您仍然可以这样做,这是正确的方法,因为您希望对基础类型调用构造函数

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

    Me.Text = "Something" 

End Sub

您仍然可以这样做,这是正确的方法,因为您需要对底层类型调用构造函数

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

    Me.Text = "Something" 

End Sub

我可以问你为什么要在构造函数中这样做吗?你能举个例子说明你想做什么吗?那就更容易找到解决办法了你可以订阅
TextChanged
活动,在文本第一次更改时在那里做你的工作,然后取消订阅活动。嗨,我在这里没有太多经验,我不确定如何发布类似于上面原始内容的回复,在那里我可以键入代码等。。。这仅用于简短的回复等。我将在下面发布一个更详细的回答(不确定这是否是正确的做法),以提供更多细节。评论仅用于简短信息/问题,是的。只有当他们确实试图回答问题时,才应提交答案,但是您可以通过下方的
编辑
按钮编辑您的问题,以包含更多信息(您似乎已经发现了:)。我知道您希望这样做以再次进入OOP,因此,我只想说这句话供将来参考:WinAPI有一个内置的窗口消息,用于设置文本框的标题(这里称为Cue),您可以使用它。请参阅(可以使用联机转换器转换为VB.NET)。H Vincent。非常抱歉这么长时间粗鲁地拖延回复,但生活中发生的事情把我从这件事中拖了出来,非常抱歉。我打算今天/明天再看一遍,但是非常感谢你的帮助!我可以问你为什么要在构造函数中这样做吗?你能举个例子说明你想做什么吗?那就更容易找到解决办法了你可以订阅
TextChanged
活动,在文本第一次更改时在那里做你的工作,然后取消订阅活动。嗨,我在这里没有太多经验,我不确定如何发布类似于上面原始内容的回复,在那里我可以键入代码等。。。这仅用于简短的回复等。我将在下面发布一个更详细的回答(不确定这是否是正确的做法),以提供更多细节。评论仅用于简短信息/问题,是的。只有当他们确实试图回答问题时,才应提交答案,但是您可以通过下方的
编辑
按钮编辑您的问题,以包含更多信息(您似乎已经发现了:)。我知道您希望这样做以再次进入OOP,所以我只想说这句话作为将来的参考:WinAPI有一个b