解决方案1
首先知道您可以在 VB.Net中将多个事件连接到Windows 窗体中的单个事件处理程序。
Private TextBox1_GotFocus(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.GotFocus, TextBox2.GotFocus
' Add event-handler code here.
End Sub
解决方案2
然后,清除文本框文本的通用事件处理程序(感谢@Miky Dinescu 提供原始解决方案和 C# 代码)是开始减少代码和共享一些方法的另一种可能的解决方案。
只需将此代码放在您的 Form.vb 中,或者如果您想在多个表单之间共享方法,则将其放在新的类 HelperClass 中。
在 Form.vb 中:
Private Sub ClearTextBox(ByVal sender As Object, ByVal e As EventArgs)
If TypeOf sender Is TextBox Then
(DirectCast(sender, TextBox)).Text = ""
End If
End Sub
或在 HelperClass.vb 中:
Public Shared Sub ClearTextBox(ByVal sender As Object, ByVal e As EventArgs)
If TypeOf sender Is TextBox Then
(DirectCast(sender, TextBox)).Text = ""
End If
End Sub
然后,您只需将此处理程序附加到所有文本框,基本上是在表单的构造函数中、在 FormLoad 事件中或在您之前调用以显示表单的“Initialize”方法中:
AddHandler textbox1.GotFocus, AddressOf Me.ClearTextBox
AddHandler textbox2.GotFocus, AddressOf Me.ClearTextBox
或者
AddHandler textbox1.GotFocus, AddressOf HelperClass.ClearTextBox
AddHandler textbox2.GotFocus, AddressOf HelperClass.ClearTextBox
但这意味着您需要将此处理程序附加到所有文本框。如果您有多个处理程序,则需要将每种方法应用于每个 TextBox...
如果您在关闭表单时明确调用 AddHandler 以防止内存泄漏,您还应该删除所有这些事件处理程序......
RemoveHandler textbox1.GotFocus, AddressOf HelperClass.ClearTextBox
RemoveHandler textbox2.GotFocus, AddressOf HelperClass.ClearTextBox
所以我建议这样做只是为了在一些控件之间共享方法。
编辑
当然,就像@DonA 建议的那样,可以通过使用循环再次减少代码。
但不要忘记RemoveHandler
。
解决方案3
另一种解决方案是创建您自己的继承自 TextBox 的自定义 TextBox 类,然后使用此自定义类替换 TextBox,或者如果您已经创建了项目,则替换现有的 TextBox。
Public Class MyTextbox
Inherits TextBox
Protected OverridesSub OnGotFocus(ByVal e As System.EventArgs)
MyBase.OnGotFocus(e)
Me.Text = String.Empty
End Sub
End Class
然后构建项目。您现在应该在 ToolBox 中看到 MyTextbox。您可以使用它或将现有的 TextBox 替换为 MyTextBox
使用这种方法,您只需要维护一个类的方法。并且无需担心处理程序...
面向对象编程的一大特点是继承:不要剥夺自己!
最后,我不确定清除 GetFocus 上的文本是否适合您尝试做的事情。它似乎是 WinForms 中的“水印文本框”或“提示横幅”。所以你可能对此感兴趣:WinForms 中的 Watermark TextBox或者考虑使用 Enter 事件并防止删除用户输入。
希望这可以帮助。