我正在使用手风琴Ajax控件。对于每个Accordion窗格,我都有动态创建的文本和Button。当用户触发click事件时,我想知道触发了哪个窗格中的按钮。所以我想以一种方式处理按钮的click事件,我可以将ID(可能是事件args)发送到事件处理程序,以便处理程序根据按下的按钮知道要做什么。
我知道我必须做这样的事情:
AddHandler bGetSessionMembers.Click, AddressOf bGetSessionMembers_click
但是我想做这样的事情:
AddHandler bGetSessionMembers.Click, AddressOf bGetSessionMembers_click(Me, "My ID")
我认为你可以用C#
做到这一点bGetSessionMembers.Click += bGetSessionMembers_click(Me, "My ID")
或者甚至在C#中,但是有了无数的代表。
有没有人有线索?
答案 0 :(得分:2)
这是一种更好的方法。首先,按正常方式连接按钮:
AddHandler Button1.Click, AddressOf Click
AddHandler Button2.Click, AddressOf Click
然后创建一个Click
方法,如下所示:
Sub click(ByVal o As Object, ByVal e As EventArgs)
Dim button As Button = TryCast(o, Button)
If button IsNot Nothing Then
End If
End Sub
在if语句中你现在有一个Button
- 你可以抓住它的ID
或其他关于你喜欢的内容。
编辑以回复评论:
我认为您可能误解了.NET中事件的连接方式。当你这样做时:
AddHandler Button2.Click, AddressOf Click
您没有调用方法Click
,而是将委托传递给编译器生成的Button.Click
事件的方法,该方法将您的委托添加到委托调用列表中。当Button
引发其Click
事件时,Button
会调用您的委托。
由于您不是通过委托调用方法的人,因此无法更改传入的内容。您最好的选择是使用传递给您的Object
并将其转换为{{1就像我上面做的那样。
答案 1 :(得分:1)
安德鲁的答案非常棒,而且正是我所做的。我只想添加他编写的代码片段,因为该空行看起来像是在为一个片段而烦恼,显示如何使用System.Web.UI.Button的CommandArgument和CommandName属性:
Sub click(ByVal o As Object, ByVal e As EventArgs)
Dim button As Button = TryCast(o, Button)
If button IsNot Nothing Then
Select Case button.CommandName
Case "Command1"
'Your cool feature here :)
Case "Command2"
'You could check button.CommandArgument to get additional data
Case Else
'Runs if button.CommandName isn't handled by your code
End Select
End If
End Sub
安迪 - 希望你不介意我在这里扔更多的东西:)
HTH,
理查德。