当我在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
答案 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
<小时/> 话虽这么说,但在你的问题中有一些令我感到震惊的事情:
任何时候您解决问题的方法都是“复制粘贴”代码,您应该停下来,退后一步,并尝试找出是否有更好的方法来实现您的最终目标。
例如,如果您需要表单上的每个文本框,以便在引发特定事件时以相同方式做出反应,则应考虑对现有TextBox
控件进行子类化并合并所有你的代码在一个地方。请记住,您可以继承大多数标准控件以添加自定义功能。与将代码复制并粘贴到项目中的多个位置相比,这通常是一个更好的解决方案。如果您需要追踪错误或修改该功能,您只需将其更改为代码中的一个位置,而不是几个。作为一种更有利的好处,当您编辑其子类时,您将能够使用Me
来引用该控件。
您应该始终更喜欢使用VB.NET中的&
运算符而不是+
符号来连接(组合)字符串。或者甚至更好,DirectCast
或String.Concat
方法。
没有理由在VB.NET中使用MsgBox
,而不是String.Format
。不,这不会提高应用程序的性能,但是使用.NET语言是一种很好的做法。
答案 1 :(得分:0)
sender变量包含您要访问的TextBox实例。您只需要将发件人转换为TextBox。