如何从控件的方法中引用控件(比如类的“me”)?

时间:2010-12-28 09:59:46

标签: vb.net winforms controls

当我在VB.NET中的控件方法中时,如何引用控件?

例如,我想在文本框中每次文本更改时都显示带有该文本框文本的消息框。代码类似于:

Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged

msgbox("The text is:"+ Me.text)    

' ok the line above wont work i already know that, because "Me" refer to the form,
' not the control textbox1
' how i will refer to the textbox1's text???
' i dont want to use "textbox1.text" is there a way similar like the "Me" is for forms?
' because i want to copy-paste a code like this in a lot of controls and do not want to
' have to change in every copy the name to each control name

End Sub

我希望自己清楚明白;我的英语需要一些改进:D

2 个答案:

答案 0 :(得分:4)

不,没有关键字允许你这样做。但是,控件引发的每个事件都会传入sender参数,您可以使用该参数来确定引发该事件的特定控件。

请注意,此参数始终键入为基本Object(因为它可以表示任何可能的控件),因此如果您需要访问任何唯一的控件,则需要向下转换为更具体的控件类它暴露的成员。由于您正在处理由TextBox控件引发的事件,因此您知道sender 必须属于TextBox类型,因此您只需使用{{ 3}}来处理向上转换。您不必担心会抛出InvalidCastException

例如,您的上述示例将变为:

Private Sub TextBox1_TextChanged(ByVal sender As Object, ByVal e As EventArgs) Handles TextBox1.TextChanged
    Dim textBox As TextBox = DirectCast(sender, TextBox)
    MessageBox.Show("The text is: " & textBox.Text)
End Sub

<小时/> 话虽这么说,但在你的问题中有一些令我感到震惊的事情:

  1. 任何时候您解决问题的方法都是“复制粘贴”代码,您应该停下来,退后一步,并尝试找出是否有更好的方法来实现您的最终目标。

    例如,如果您需要表单上的每个文本框,以便在引发特定事件时以相同方式做出反应,则应考虑对现有TextBox控件进行子类化并合并所有你的代码在一个地方。请记住,您可以继承大多数标准控件以添加自定义功能。与将代码复制并粘贴到项目中的多个位置相比,这通常是一个更好的解决方案。如果您需要追踪错误或修改该功能,您只需将其更改为代码中的一个位置,而不是几个。作为一种更有利的好处,当您编辑其子类时,您将能够使用Me来引用该控件。

  2. 您应该始终更喜欢使用VB.NET中的&运算符而不是+符号来连接(组合)字符串。或者甚至更好,DirectCastString.Concat方法。

  3. 没有理由在VB.NET中使用MsgBox,而不是String.Format。不,这不会提高应用程序的性能,但是使用.NET语言是一种很好的做法。

答案 1 :(得分:0)

sender变量包含您要访问的TextBox实例。您只需要将发件人转换为TextBox。