我很肯定这是非常简单的事情,但我已经完全冻结了脑袋。
我正在尝试创建自己的控件,它会为文本框添加一些特定功能,并最终希望此控件在我的工具箱中可用,以便在整个项目中使用。
作为一个例子,我想将这个新控件添加到我的表单中,将.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
答案 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