我对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
。
这两个参数有哪些常见用法?它们总是需要吗?
谢谢,
答案 0 :(得分:16)
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
答案 1 :(得分:5)
e
指的是已使用事件的事件参数,它们通常以属性/函数/方法的形式出现。
在此示例中,标签文本属性将包含我们GridView
的页脚样式的BorderColor集,其FooterRow(根据作为事件参数参数的属性发送的行确定)使用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
答案 2 :(得分:1)
对于问题的前半部分:
当回调处理多个事件时,使用 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
参考here。