我想创建一个函数或子函数,在它获得焦点时清除文本框。例如:
textbox1
包含:“你的名字在这里。”
当用户点击它时。 “你的名字在这里。”会消失。我已将textbox1.clear
置于GotFocus
的{{1}}事件中。
现在我打算在其中添加更多代码。但事情是编码会重复而且很长,因为我打算在许多文本框中执行此操作。我想最小化编码,所以我想创建一个在聚焦时清除文本框的函数,这样我就可以在textbox
事件中调用函数并以某种方式减少编码。
我现在不知道怎么做,所以如果有人那么我真的很感谢你能给我的建议。
我正在使用visual studio 2010,并创建一个Windows窗体应用程序项目。
答案 0 :(得分:5)
<强>解决方法1 强>
首先知道你可以在VB.Net中,在Windows窗体中connect Multiple Events to a Single Event Handler。
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。如果您有多个处理程序,则需要将每个方法应用于每个TextBox ...
如果你想要防止内存泄漏,如果你在关闭表单时明确地调用AddHandler,你也应该删除所有这些事件处理程序...
RemoveHandler textbox1.GotFocus, AddressOf HelperClass.ClearTextBox
RemoveHandler textbox2.GotFocus, AddressOf HelperClass.ClearTextBox
所以我建议这只是为了在一些控件之间共享方法。
编辑
当然,使用循环可以再次减少代码,就像@DonA建议的那样。
但请不要忘记RemoveHandler
。
<强> Solution3 强>
另一个解决方案是创建自己的自定义TextBox类,该类继承自TextBox,然后在TextBox的重新处理中使用此Custom类,或者如果您已经创建了项目,则替换现有的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。 您可以使用它或用MyTextBox替换现有的TextBox
使用这种方法,您只需要维护一个类的方法。而且无需担心处理程序......
面向对象编程的一个重要特征是inheritance:不要剥夺自己!
最终,我不确定GetFocus上的文字是否适合您尝试做的事情。它似乎是WinForms中的“Watermark TextBox”或“Cue Banner”。因此您可能对此感兴趣:Watermark TextBox in WinForms或者可能考虑使用Enter Event并阻止删除用户输入。
希望这有帮助。
答案 1 :(得分:1)
找到所有文本框并创建数组,循环遍历数组并添加got_Focus子句法的处理程序。
Private Sub Form_Load(sender As Object, e As EventArgs) Handles Me.Load
'array by type
Dim tbs = Me.Controls.OfType(Of TextBox)()
'loop thru and add the delegate
Array.ForEach(Of TextBox)(tbs.ToArray, Sub(tb) AddHandler tb.GotFocus, AddressOf got_Focus)
End Sub
Private Sub got_Focus(sender As Object, e As System.EventArgs)
'cast our sender object to textbox and clear it's content
DirectCast(sender, Textbox).Clear
End Sub
答案 2 :(得分:0)
好的,所以我可能对这个名为StackOverflow.com的社区不熟悉,但我不是桌面编程的新手,也不是一般的编程,因为同样的问题也很可能也适用于Web Forms。所以这里有一个更简单的方法,根本没有人提及,例如:
Public Class LoginForm1
Private Sub TextBox1_Click(sender As Object, e As EventArgs) Handles TextBox1.Click
TextBox1.Text = ""
End Sub
End Class
现在您可以看到,当 EventArgs 又称事件发生时,鼠标点击文本框或TextBox1时,它会自动清除该框。