VB.NET中的Sender用于什么?

7
我对Winform控件中sender参数的用途感到困惑,例如:
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

End Sub

我知道可以通过以下方式验证sender的内容:

If TypeOf sender Is Label Then
 'Execute some code...
End If

但是,当每个控件为我生成子程序时,是否有充分的理由将发送者包含在其中?换句话说,我双击一个表单,然后我得到了 Private Sub form_load (sender....) e As System.EventArg

这两个参数的常见用途是什么?它们总是必需的吗?

3个回答

20

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

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

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

非常感谢您的快速回复,minitech!为什么要使用DirectCast将传入的(sender)转换为按钮,我们不能假设它是一个按钮吗?因为您的Handles从Button1.Click一直到Button9.Click。还是这指的是我错过了其他东西?谢谢! - Dayan
5
@Intrus: 我使用 DirectCast 是因为 sender 被声明为一个 Object(这是事件处理程序的工作方式),我可以假设它是一个 Button,所以我没有进行检查就进行了强制转换。如果你在不开启 Option Strict On 的情况下编码,那么代码 编译通过,但运行速度会变慢,而且后期发现错误会更加困难。(专业提示:一定要开启 Option Strict On!它在你的设置中。) - Ry-
我已经习惯了使用 Option Strict On,但是感谢您的提示和非常清晰的答案。 - Dayan

5

e 是指用于某个事件的事件参数,通常以属性/函数/方法形式提供并可在其中使用。

在此示例中,当GridView的FooterRow(由作为事件参数属性的行确定)将数据与GridView DataSource绑定时,标签文本属性将包含为其底部样式设置的BorderColor。

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

CoderRoller,非常感谢你对我第二个问题的出色回答! - Dayan

2

首先回答第一个问题:

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

参考此处

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接