1

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

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

当用户点击它时。“你的名字在这里。” 会消失。我已经通过放置textbox1.clear.GotFocustextbox

现在我打算在里面放更多的代码。但问题是编码会重复且冗长,因为我计划在许多文本框中执行此操作。我想最小化编码,所以我想创建一个在文本框获得焦点时清除文本框的函数,这样我就可以在GotFocus事件中调用该函数并以某种方式减少编码。

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

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

4

3 回答 3

5

解决方案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 事件并防止删除用户输入。

希望这可以帮助。

于 2013-05-26T04:27:05.000 回答
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
于 2013-05-26T02:25:32.670 回答
0

好的,所以我可能是这个名为 StackOverflow.com 的社区的新手,但我对桌面编程和一般编程都不是新手,因为同样的问题也很可能也适用于 Web 表单。所以这是一种更简单的方法,根本没有人提到,下面的例子:

Public Class LoginForm1

      Private Sub TextBox1_Click(sender As Object, e As EventArgs) Handles TextBox1.Click
        TextBox1.Text = ""

        End Sub

End Class

现在您可以看到,当EventArgs又名 Event 发生时,鼠标点击文本框或 TextBox1,它会自动清除该框。

于 2014-02-23T03:57:20.673 回答