使用addhanler委托如何传递参数

动态添加的菜单
a.MenuItems.Add(b)
b.Text = "Open"
AddHandler b.Click, AddressOf MenuItemOpen_Click
Menu = m

Private Sub MenuItemOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
MsgBox("you click Open")
End Sub

想给MenuItemOpen_Click传参数,根据传的参数得到返回值,能实现吗?该如何做

---------------------------------------------------------------

你的意思大概是这样吧:
Private Sub MenuItemOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
if sender is mnuOpen then
MsgBox("you click Open")
elseif sender is mnuClose then
MsgBox("you click Close")
end if
End Sub
---------------------------------------------------------------

嗯,大概明白了楼主的意思。

您的需求大概是这样的:
把一个菜单(下面的例子用一个名为MainMenu1的主菜单控件)的所有子菜单项用一个公用的过程来处理。

实现此目的,共分3步走:

第一步:写好 公用的 菜单单击处理方法
Private Sub MenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim Item As MenuItem = DirectCast(sender, MenuItem)
Select Case Item.Index
Case 0
'你的处理代码
Case 1
'你的处理代码
Case 2
'你的处理代码
Case ...
'你的处理代码
End Select
End Sub
注意:上面采用了通过菜单项的索引索引值来区分菜单的。
不过这种方式不太妥当,推荐使用 菜单的Text来区分菜单。

第二步:写一个用于把 菜单事件 和 公用的菜单处理过程 关联起来的 子程序:
'关联某一个菜单控件上的所有的子菜单至某一个过程(1/2个过载)
Overloads Sub AssociateMenuItemsEventHandler(ByVal mnu As MainMenu)
For I As Integer = 1 To mnu.MenuItems.Count
AssociateMenuItemsEventHandler(mnu.MenuItems.Item(I - 1))
Next
End Sub

'关联某一个(组)菜单及其所有的子菜单(2/2个过载)
Overloads Sub AssociateMenuItemsEventHandler(ByVal mi As MenuItem)
If Not mi.IsParent Then
AddHandler mi.Click, AddressOf MenuItem_Click
Else
For Each item As MenuItem In mi.MenuItems
AssociateMenuItemsEventHandler(item) '递归调用
Next
End If
End Sub

第三步:在合适的时候(一般是在初始化窗体元素或窗体的Load事件中)关联菜单事件。
考虑到代码的可维护性,推荐把这条语句放到窗体的Load事件中:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
AssociateMenuItemsEventHandler(MainMenu1)
End Sub

OK

Published At
Categories with Web编程
Tagged with
comments powered by Disqus