VB.NET发送器的用途是什么?

VB.NET发送器的用途是什么?,vb.net,sender,Vb.net,Sender,我对Winform控件中的sender参数的用途感到困惑,例如: Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load End Sub 我知道我可以通过这样做来验证发送方持有的信息: If TypeOf sender Is Label Then 'Execute some code... End If 但是,当发送方为我生成子例程时,它包含在每个控件中,这有什么

我对Winform控件中的
sender
参数的用途感到困惑,例如:

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

End Sub
我知道我可以通过这样做来验证
发送方
持有的信息:

If TypeOf sender Is Label Then
 'Execute some code...
End If
但是,当发送方为我生成子例程时,它包含在每个控件中,这有什么好的理由吗?换句话说,我双击一个表单,得到
私有子表单加载(发送方…)
e As System.EventArg
s

这两个参数的一些常见用法是什么?是否总是需要它们?

谢谢,


Dayan D.

发送方
包含事件的发送方,因此如果将一个方法绑定到多个控件,则可以区分它们

例如,如果您有十个按钮,并希望在单击其中一个按钮时将其文本更改为“you clicked me!”,则每次可以使用不同的按钮名称为每个按钮使用一个单独的处理程序,但最好同时处理所有按钮:

Private Sub Button_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click, Button3.Click, Button4.Click, Button5.Click, Button6.Click, Button7.Click, Button8.Click, Button9.Click
    DirectCast(sender, Button).Text = "You clicked me!"
End Sub

e
是指所用事件的事件参数,它们通常以属性/函数/方法的形式出现,可以在其上使用

在本例中,label text属性将包含我们的
GridView
的页脚样式的BorderColor集,当其页脚行(由作为事件参数属性发送的行确定)与GridView数据源绑定数据时

Private Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
        If e.Row.RowType = DataControlRowType.Footer Then
            lblFooterColor.Text = e.Row.Style("BorderColor")
        End If
End Sub

关于问题的前半部分:

sender
在回调处理多个事件时使用,以了解哪个对象触发了事件

例如,您可以使用相同的代码管理两个不同的按钮单击事件,而不是在两个回调函数中剪切和粘贴相同的代码:

Private Sub Button_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click
   Dim s As String
   If sender Is Button1 Then
      s = "button1"
   ElseIf sender Is Button2 Then
      s = "button2"
   End If
   MessageBox.Show("You pressed: " + s)
End Sub

参考。

非常感谢minitech,反应非常快!为什么您要使用DirectCast将传入(发件人)转换为按钮,我们不能假定它是一个按钮,因为您的句柄反映了按钮1。单击一直到按钮9。单击?或者这是指我错过的其他东西;)谢谢@Intrus:我使用的是
DirectCast
,因为
sender
被声明为
对象(这就是事件处理程序的工作方式),我可以假设它是一个
按钮,所以我在不检查的情况下对其进行强制转换。如果您没有对
严格要求的
选项进行编码,则它将使用
sender.Text
进行编译,但速度会较慢,并且以后查找错误会更困难。(ProTip:始终打开
选项Strict On
!这在您的设置中。)我已经习惯了选项Strict On,但感谢您提供的提示和非常清晰的答案。回答我问题的第二部分很好CoderRoller,非常感谢!