在获得焦点时清除文本框的函数或子函数

时间:2013-05-26 00:58:46

标签: vb.net winforms textbox

我想创建一个函数或子函数,在它获得焦点时清除文本框。例如:

textbox1包含:“你的名字在这里。”

当用户点击它时。 “你的名字在这里。”会消失。我已将textbox1.clear置于GotFocus的{​​{1}}事件中。

现在我打算在其中添加更多代码。但事情是编码会重复而且很长,因为我打算在许多文本框中执行此操作。我想最小化编码,所以我想创建一个在聚焦时清除文本框的函数,这样我就可以在textbox事件中调用函数并以某种方式减少编码。

我现在不知道怎么做,所以如果有人那么我真的很感谢你能给我的建议。

我正在使用visual studio 2010,并创建一个Windows窗体应用程序项目。

3 个答案:

答案 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时,它会自动清除该框。