Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 如何从控件的方法中引用控件(如类的“me”)?_Vb.net_Winforms_Controls - Fatal编程技术网

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

Vb.net 如何从控件的方法中引用控件(如类的“me”)?,vb.net,winforms,controls,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 abov

当我在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

我希望我说清楚了;我的英语需要提高:不,没有关键字可以让你这么做。但是,控件引发的每个事件都会传入一个发送方参数,您可以使用该参数确定哪个控件引发该事件

请注意,此参数始终作为基本对象键入,因为它可以表示任何可能的控件,因此如果需要访问它公开的任何唯一成员,则需要向下转换到更特定的控件类。由于您正在处理由TextBox控件引发的事件,因此您知道发送方必须是TextBox类型,因此您可以简单地使用来处理向上转换。您不必担心会抛出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
话虽如此,在你的问题中,有几件事让我感到担忧:

每当您解决问题的方法是复制粘贴代码时,您都应该停止,后退一步,并尝试找出是否有更好的方法来实现最终目标

例如,如果需要在窗体上的每一个文本框以相同的方式对特定事件进行响应,则应考虑对现有的Tabbox控件进行子类化,并将所有代码合并到一个位置。请记住,您可以继承大多数标准控件来添加自定义功能。这通常比将代码复制和粘贴到项目中的多个位置要好得多。如果您需要跟踪bug或修改该功能,您只需在代码中更改一个位置,而不是几个位置。作为一个更厚颜无耻的好处,您可以在编辑其子类时使用我来引用该控件

在VB.NET中,您应该始终喜欢使用&运算符而不是+符号连接组合字符串。或者,也许更好的方法,或者是方法

没有理由在VB.NET中使用MsgBox,而不是使用。不,这不会提高应用程序的性能,但这是一个很好的实践,可以使用for.NET语言


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

请注意,此参数始终作为基本对象键入,因为它可以表示任何可能的控件,因此如果需要访问它公开的任何唯一成员,则需要向下转换到更特定的控件类。由于您正在处理由TextBox控件引发的事件,因此您知道发送方必须是TextBox类型,因此您可以简单地使用来处理向上转换。您不必担心会抛出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
话虽如此,在你的问题中,有几件事让我感到担忧:

每当您解决问题的方法是复制粘贴代码时,您都应该停止,后退一步,并尝试找出是否有更好的方法来实现最终目标

例如,如果需要在窗体上的每一个文本框以相同的方式对特定事件进行响应,则应考虑对现有的Tabbox控件进行子类化,并将所有代码合并到一个位置。请记住,您可以继承大多数标准控件来添加自定义功能。这通常比将代码复制和粘贴到项目中的多个位置要好得多。如果您需要跟踪bug或修改该功能,您只需在代码中更改一个位置,而不是几个位置。作为一个更厚颜无耻的好处,您可以在编辑其子类时使用我来引用该控件

在VB.NET中,您应该始终喜欢使用&运算符而不是+符号连接组合字符串。或者,也许更好的方法,或者是方法

没有理由在VB.NET中使用MsgBox,而不是使用。不,这不会提高应用程序的性能,但这是一个很好的实践,可以使用for.NET语言


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

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

我尝试搜索MyBase、Parent和Me,但没有找到任何可以自引用控件的内容…:我试着搜索MyBase、Parent和Me,但我没有找到任何可以自我参照的控件…:+1虽然我也会考虑而不是
正在搜索文本框。@MarkJ:当然,这取决于具体的需要。我只是觉得我已经离主题有点远了-我认为您在这个主题上是正确的,您将许多控件中的复制粘贴代码识别为警告标志。如果在编码时使用“复制和粘贴”,则可能犯了设计错误。对于更具体的控件类来说,是向下转换,而不是向上转换。我也同意你的评论,我相信我应该在调试完为textbox创建的额外函数后立即向下转换textbox控件。再次感谢您的回答和建议。所有这些都指向编程的正确实践,我非常感谢您的帮助。+ 1,虽然我也会考虑而不是子类TeXBox。@ MARJ:当然,这取决于具体的需要。我只是觉得我已经离主题有点远了-我认为您在这个主题上是正确的,您将许多控件中的复制粘贴代码识别为警告标志。如果在编码时使用“复制和粘贴”,则可能犯了设计错误。对于更具体的控件类来说,是向下转换,而不是向上转换。我也同意你的评论,我相信我应该在调试完为textbox创建的额外函数后立即向下转换textbox控件。再次感谢您的回答和建议。所有这些都指向了正确的编程实践,我非常感谢您的帮助。