在Module中动态添加MenuStrip及Click事件

sad_hu 2015-04-25 10:30:46
在工程的模块中写一段为各个窗体添加菜单的代码,但由于Click事件不在模块中,要怎么解决
public g_prog as string '全局变量,已在Form1中给值
Private Sub AddMenuBar()
Dim NewAddMenuBar As DefaultForm = CType(Application.OpenForms(g_prog), DefaultForm)
Dim l_NumName() As String
Dim l_i As Integer
Dim l_txt As String
Dim l_click As String
Dim l_topname As String

l_NumName = GetMenuName() ‘从资料库取菜单项
For l_i = 0 To UBound(l_NumName)
l_txt = Trim(Split(l_NumName(l_i), "~")(0))
l_click = Trim(Split(l_NumName(l_i), "~")(1))
l_topname = Trim(Split(l_NumName(l_i), "~")(2))
If l_topname = "menu" Then
NewAddMenuBar.MenuStrip.Items.Add(l_txt, Nothing, AddressOf MenuStrip_Click).Name = l_click
Else
Dim doItem As ToolStripMenuItem = NewAddMenuBar.MenuStrip.Items(l_topname)
doItem.DropDownItems.Add(l_txt, Nothing, AddressOf MenuStrip_Click).Name = l_click
End If
Next
End Sub

异常在AddressOf MenuStrip_Click部分,由于MenuStrip_Click是在Form已不在Module所以异常“未声明的MenuStrip_Click事件”
...全文
495 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
sad_hu 2015-05-14
  • 打赏
  • 举报
回复
非常感谢各位,好久没来了,晚上回去试试
  • 打赏
  • 举报
回复
写错了一行,改一下
Public Class AddMenuBarHelperObject
 
    Public Event Clicked As EventHandler
 
    Public FormName As String
 
    Public Sub AddMenu()
             ............................
             RaiseEvent Clicked(me, ...)
            ............................
    End Sub
 
End Class
当然上述代码中的所有的委托类型都是可以自定义的,这里写 EventHandler 只是示例。
  • 打赏
  • 举报
回复
在你的类库方法中,将delegate的实例作为对象传给 AddMenuBar 方法。这是一种形式。 你可以采取面向对象的class方式,它也是可共享的一种常见形式。例如
Public Class AddMenuBarHelperObject

    Public Event Clicked()

    Public FormName As String

    Public Sub AddMenu()
             ............................
             RaiseEvent Clicked(me, ...)
            ............................
    End Sub

End Class
这样,也是可以从外部注册事件委托的。
  • 打赏
  • 举报
回复
由于你的方法 Private Sub AddMenuBar() 定义为 private 的,所以你就根本没有说明白你的这个方法到底是如何调用的。这就无法直接进行设计。 假如它就是对外接口方法,那么它应该定义为类似这样的形式

Private Sub AddMenuBar(abc as EventHandler)
...........
    NewAddMenuBar.MenuStrip.Items.Add(l_txt, Nothing, abc).Name = l_click
 
它不需要知道delegate具体是什么,只有调用它的代码才需要知道:
AddMenuBar(AddressOf Form1.Menu_Click)
sad_hu 2015-05-02
  • 打赏
  • 举报
回复
不同窗体的菜单不同,所以没办法发在基类
红衣老大 2015-05-02
  • 打赏
  • 举报
回复
很理解 lz 他正处于 vb6 向 vb.net 过渡阶段 我也有过,虽然还没有过度完全 ******************* 原来可以用马甲 连续回复啊,学习了
sp1234_maJia 2015-05-02
  • 打赏
  • 举报
回复
嗯,上述 RaiseEvent 是不对的,你只是要把它作为参数,所以可以改为
Public Class AddMenuBarHelperObject

    Public Event Clicked As EventHandler

    Public FormName As String

    Public Sub AddMenu()
             ............................
             NewAddMenuBar.MenuStrip.Items.Add(l_txt, Nothing, AddressOf abc).Name = l_click
            ............................
    End Sub

    Sub abc(sender As Object, e As EventArgs)
        RaiseEvent Clicked(sender, e)

    End Sub

End Class
这也就是用“class本地”的一个abc作为中间代理,对外只暴露一个标准的事件机制,从而实现从过程化转变为对象化的定义风格。
楚狂歌 2015-04-27
  • 打赏
  • 举报
回复
引用 3 楼 sad_hu 的回复:
[quote=引用 1 楼 u012804018 的回复:] MenuStrip_Click定义成全局的不行???
不行,而且在其他的窗体也会有MenuStrip_Click[/quote] 模块里加上namespace
Tiger_Zhao 2015-04-27
  • 打赏
  • 举报
回复
你不会在 DefaultForm 这个基类中实现添加菜单啊!
统一的功能放在基类中,很自然的做法,为什么还要搞个模块来做?
鏡椛氹鈅 2015-04-27
  • 打赏
  • 举报
回复
引用 7 楼 sad_hu 的回复:
抱歉,刚忘了说,Form窗体的menustrip是继承过来的,所以在封装的时候提示“MenuStrip_Click不是Form的事件"
Form本身也是个类啊,form能继承使用的,类也可以啊...
sad_hu 2015-04-25
  • 打赏
  • 举报
回复
抱歉,刚忘了说,Form窗体的menustrip是继承过来的,所以在封装的时候提示“MenuStrip_Click不是Form的事件"
鏡椛氹鈅 2015-04-25
  • 打赏
  • 举报
回复
引用 5 楼 sad_hu 的回复:
[quote=引用 4 楼 u012804018 的回复:]
[quote=引用 3 楼 sad_hu 的回复:]
[quote=引用 1 楼 u012804018 的回复:]
MenuStrip_Click定义成全局的不行???


不行,而且在其他的窗体也会有MenuStrip_Click[/quote]
MenuStrip_Click 你把他封装起来不就行了...[/quote]

怎么封装,我是初学,谢谢![/quote]

代码:
Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
AddHandler Button1.Click, AddressOf Class1.Button4_Click
AddHandler Button2.Click, AddressOf Class1.Button4_Click
AddHandler Button3.Click, AddressOf Class1.Button4_Click
AddHandler Button4.Click, AddressOf Class1.Button4_Click
End Sub
End Class

Imports System.Windows.Forms
Public Class Class1
Public Shared Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim but As Button = sender
MessageBox.Show("当前显示的Button:" & but.Name)
End Sub
End Class
sad_hu 2015-04-25
  • 打赏
  • 举报
回复
引用 4 楼 u012804018 的回复:
[quote=引用 3 楼 sad_hu 的回复:] [quote=引用 1 楼 u012804018 的回复:] MenuStrip_Click定义成全局的不行???
不行,而且在其他的窗体也会有MenuStrip_Click[/quote] MenuStrip_Click 你把他封装起来不就行了...[/quote] 怎么封装,我是初学,谢谢!
鏡椛氹鈅 2015-04-25
  • 打赏
  • 举报
回复
引用 3 楼 sad_hu 的回复:
[quote=引用 1 楼 u012804018 的回复:] MenuStrip_Click定义成全局的不行???
不行,而且在其他的窗体也会有MenuStrip_Click[/quote] MenuStrip_Click 你把他封装起来不就行了...
sad_hu 2015-04-25
  • 打赏
  • 举报
回复
引用 1 楼 u012804018 的回复:
MenuStrip_Click定义成全局的不行???
不行,而且在其他的窗体也会有MenuStrip_Click
sad_hu 2015-04-25
  • 打赏
  • 举报
回复
附加: 或者在添加的时候不加Click事件,回到Form的时候要怎么触发各个菜单项 If l_topname = "menu" Then 'NewAddMenuBar.MenuStrip.Items.Add(l_txt, Nothing, AddressOf MenuStrip_Click).Name = l_click NewAddMenuBar.MenuStrip.Items.Add(l_txt, Nothing, Nothing).Name = l_click Else Dim doItem As ToolStripMenuItem = NewAddMenuBar.MenuStrip.Items(l_topname) 'doItem.DropDownItems.Add(l_txt, Nothing, AddressOf MenuStrip_Click).Name = l_click doItem.DropDownItems.Add(l_txt, Nothing, Nothing).Name = l_click End If
鏡椛氹鈅 2015-04-25
  • 打赏
  • 举报
回复
MenuStrip_Click定义成全局的不行???
sad_hu 2015-04-25
  • 打赏
  • 举报
回复
走过的,路过的,帮忙支支招呀

16,721

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧