返回首页

简介
在这篇文章中,我们将看到如何生成动态菜单(递归)在VB.net像菜单标题的菜单的完整的详细信息和相应的事件触发的XML数据为基础,只要用户单击菜单项等,它以这样一种方式,可以很容易地插入到任何应用程序的基础上要求写一个通用的可重用的组件。
这个组件的主要目的是生成基于XML配置文件中的值在运行时的菜单。让我们先来看看在XML配置文件,假设文件名作为Menu.xml和样品内容如下,LT; rootgt;LT; TopLevelMenu ID ="放大器;放大器; Filequot; GT;   ;LT; MenuItem的ID ="Newquot;的OnClick = quot; _Newquot; / GT;  0; LT; MenuItem的ID ="; Openquot / GT; &# 160; LT; MenuItem的ID ="发送Toquot; GT;   ; LT; MenuItem的ID ="; Mailquot / GT;  0; LT; MenuItem的ID ="我的Documentsquot; / GT; LT; / MenuItemgt;LT; / TopLevelMenugt;LT; TopLevelMenu ID ="放大器;放大器; Editquot; GT; &# 160; LT; MenuItem的ID ="; Copyquot / GT; LT; MenuItem的ID ="Pastequot;的OnClick = quot; _Pastequot; / GT; 60; LT; MenuItem的ID ="Clearquot; GT;  60; LT; MenuItem的ID ="Famp;放大器; ormatsquot; / GT; LT; MenuItem的ID ="Contentsquot; GT; &# 160; LT; MenuItem的ID ="Testquot;的OnClick = quot; _Testquot; / GT;  0;LT; / MenuItemgt; LT; / MenuItemgt;LT; / TopLevelMenugt;LT; / rootgt;
从上面的XML,其一斑TopLevelMenu定义的节点将被父/顶层菜单和MenuItem的定义的节点将它的相应的子。菜单标题名为"ID"的属性定义,你可以操纵XML文件,以显示自定义菜单项的标题。
Filenbsp; - 顶层菜单
Newnbsp; - 文件
Opennbsp的孩子; NBSP ; - ; - 文件
SendTonbsp儿童; - 是孩子的文件
Mailnbsp; - 发送到
我的文档"的孩子 - 发送到孩子
编辑 - 顶层菜单复制
- 编辑
粘贴的孩子 - 是孩子编辑
- 编辑
格式的孩子 - 是明确的儿童
内容 - 清除
测试的孩子 - 儿童的内容
注意:"放大器;放大器;"文本有利于正在定义的菜单项的快捷键使用。
的OnClick - 这是一个主要的属性,它定义了事件应该触发每当用户执行按一下特定的菜单项。例如,新的菜单项OnClick属性定义如下,LT; MenuItem的ID ="Newquot;的OnClick = quot; _Newquot; / GT;
这意味着,在该菜单显示的VB.NET表应该有下面的代码粘贴在私人小组MenuItemOnClick_New(BYVAL发件人为对象,_ 作为System.EventArgs BYVAL E) MessageBox.Show("新Clickedquot;)END SUB
请注意,事件的名称是基于以下格式陷害,
MenuItemOnClick - 组件中的硬编码值,它doesnt来自您的XML文件。
_新 - 被定义为在onclick属性。如果你改变了_新_NewItem(比方说),那么你的表单事件也应该被改变的对象,分MenuItemOnClick_NewItem(BYVAL发件人,_ &# 160; BYVAL Ë作为System.EventArgs MessageBox.Show("新Clickedquot;)END SUB
动态菜单组件公开为每个菜单项的"onclick"的属性值创建的事件处理程序。如果你不想创建一个菜单项的事件处理程序,那么你不必为它指定XML文件中的onclick属性。
现在让我们看看基于XML内容动态生成菜单组件代码的细节,
DynamicMenu.vbPublic类DynamicMenu
''''''''''''''''''''''变量声明开始'''''''''''''''''''''' "创建一个主菜单对象。 私人的MainMenu作为新的MainMenu()  60;"对象加载XML文件 由于Xml.XmlDocument私人objXML "创建"菜单项对象。 私人mItem为新的MenuItem() "应该返回菜单句柄 &# 160; 作为菜单的私人objMenu "XML菜单配置文件的路径 作为字符串的公共XMLMenuFile 在哪个菜单已被建立的"形式对象 作为对象的公共objForm ''''''''''''''''''''''变量声明结束''''''''''''''''''''''' '''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''  0; "这种方法将被调用父窗体。 "并返回菜单对象。 ''''''''''''''''''''''''' ''''''''''''''''''''''''' '''''''''''''''''' 公共功能LoadDynamicMenu() DIM oXmlElement作为Xml.XmlElement 由于Xml.XmlNode DIM objNode objXML =新Xml.XmlDocument() &# 160; "加载XML Filep; objXML.Load(XMLMenuFile) 60; '获取XML文件documentelement。 oXmlElement = CType运算(objXML.DocumentElement,Xml.XmlElement) "通过每个顶级节点循环 "对于前,文件放大器;编辑成为顶级节点 "和"文件- GT;打开,文件GT;保存,将被视为 "孩子的顶级节点 对于每一个在objXML.FirstChild.ChildNodes objNode "创建一个新的顶级节点的MenuItem  0;mItem =新的MenuItem() '设置菜单项的标题。 mItem.Text = objNode.Attributes(quot; idquot)。价值   ; "添加到主菜单的菜单项。 &# 160; mainMenu.MenuItems.Add(mItem)   ; '调用此方法来生成子节点 "这是(在上面mItem顶层节点 "言) GenerateMenusFromXML(objNode,_   ;mainMenu.MenuItems(mainMenu.MenuItems.Count - 1))  60; 下一页 返回此菜单的父窗体句柄,以便 "生成"菜单上得到显示在窗体 返回objMenu 端功能 '''''''''''''''''''''''''''''''''''''''''''''''''' '''''''''''''''''''''' & #160; "这种方法需要基于XML文件的内容加载菜单。  ; '''''''''''''''''''''''''''''''''''''''''''''''''' '''''''''''''''''''''' GenerateMenusFromXML(BYVAL objNode,由于Xml.XmlNode _ 由于MenuItem的BYVAL MITM) 60; "这种方法将被调用递归时尚&# 160; "直到所有的子节点生成。这种方法 60; "操练起来的N -水平产生所有的子节点 DIM objNod作为Xml.XmlNode  0; DIM sMenu为新的MenuItem() "循环子节点 对于每一个在objNode.ChildNodes objNod sMenu =新的MenuItem() '设置菜单项的标题。 sMenu.Text = objNod.Attributes(quot; idquot)。价值 & #160; mItm.MenuItems.Add(sM​​enu)  0; "添加事件处理程序的菜单项添加 &# 160; "这种方法需要绑定事件名称(基于 "从XML文件中的参数),新加入的菜单项。 "前,窗体代码,应该有一个  60;"私人分MenuItemOnClick_New甚至处理  60; "点击新的菜单项 & #160; 如果不objNod.Attributes("OnClickquot;)是Nothing FindEventsByName(sMenu,objForm,诚然,"MenuItemOnquot; _ objNod.Attributes("OnClickquot;)。价值) 结束如果&# 160; "调用相同的方法,看你有没有任何子节点 "为特定的节点,您已经添加(以上MITM)  0; GenerateMenusFromXML(objNod,_ mItm.MenuItems(mItm.MenuItems.Count 1)) 下一页   ; "分配到objMenu生成MainMenu对象 - 公众对象 "这是要在主窗体中使用 objMenu = MainMenu的 结束Sublt; '''''''''''''''''''''''''''''''''''''''''''''''''' '''''''''''''''''''''' "这种方法的目的是要找出私人事件目前在 "表格和新加入的MenuItem重视此事件,这是 "使用反射技术实现 '''''''''''''''''''''''''''''''''''''''''''''''''' '''''''''''''''''''''' 私人小组FindEventsByName(BYVAL发件人为对象,_ BYVAL接收机作为对象,如布尔BYVAL绑定_  ; BYVAL handlerPrefix)作为字符串,BYVAL handlerSufix作为字符串 '获取发件人的公共事件。 作为System.Reflection.EventInfo = DIM SenderEvents()  60; sender.GetType()。GetEvents() "获取接收器的类型,并查找其公共 "匹配的命名约定的方法: "handlerPrefix点击handlerSufix DIM ReceiverType = receiver.GetType(类型)   ; DIM Ë作为System.Reflection.EventInfo  60; 昏暗的方法作为System.Reflection.MethodInfo 对于每个SenderEvents发送 & #160; 方法= ReceiverType.GetMethod(_   ; handlerPrefix放大器; E.名称放大器; handlerSufix,_ System.Reflection.BindingFlags.IgnoreCase或者_  0; System.Reflection.BindingFlags.Instance或者_  60; System.Reflection.BindingFlags.NonPublic) 如果不是方法,然后是Nothing 昏暗的D为System.Delegate = _   ; System.Delegate.CreateDelegate(E. EventHandlerType,_   ; 接收器,Method.Name) &# 160; 如果绑定然后   ; "添加事件处理程序 & #160;E. AddEventHandler(发件人,D)   ; 其他 "你也可以移除事件处理程序,如果你通过绑定 "变量为假 E. RemoveEventHandler(发件人,D)  0; 结束如果   ; 结束如果 下一页 END SUB末级
LoadDynamicMenu Vb.net表格会从调用的主要方法。 ITSA功能,返回菜单句柄,它应分配给Me.Menu财产。
您可以打开一个新的VB.NET Windows应用程序项目,并添加上述DynamicMenu.vb项目,只需将其粘贴在表格下面的代码,它会生成一个动态菜单,然后将它关联到窗体。 Form1_Load的私人小组(BYVAL发件人,为System.Object _ & #160; #System.EventArgs E)把手MyBase.Load 作为新DynamicMenu DIM objMenu() "通过XML菜单的位置 - 配置文件 objMenu.XMLMenuFile ="D:\ DynamicMenu \ Menu.xmlquot; "通过Form对象动态菜单,关联菜单_ &# 160;"事件处理程序 objMenu.objForm =我 & #160; "加载动态菜单和返回菜单句柄Me.Menu对象 Me.Menu = objMenu.LoadDynamicMenu() END SUB "每当用户点击新的菜单项 - 下面的事件就会触发 私人小组MenuItemOnClick_New(BYVAL发件人为对象, & #160; 作为System.EventArgs BYVAL E) MessageBox.Show("新Clickedquot;) &# 160;END SUB "每当用户点击粘贴菜单项 - 下面的事件会得到 "触发 私人小组MenuItemOnClick_Paste(BYVAL发件人为对象,_   ; 作为System.EventArgs BYVAL E) 0; MessageBox.Show("粘贴Clickedquot;) &# 160; END SUB "每当用户点击测试菜单项 - 下面的事件就会触发 私人小组MenuItemOnClick_Test(BYVAL发件人为对象,  60; 作为System.EventArgs BYVAL E) &# 160; MessageBox.Show("测试Clickedquot;) END SUB
在上面的代码,我们正在创建DynamicMenu类的对象objMenu,我们通过XMLMenuFile财产通知DynamicMenu类XML配置文件的位置,最后我们调用LoadDynamicMenu()函数,它返回生成的菜单句柄。它会被指派的Me.Menu属性,你准备使用的菜单。
只是一个如何生成的菜单在表像的快照,

动态菜单生成逻辑,在下面的方式,它基本上是如下递归技术,加载XML文档河套地区的顶级节点(在这种情况下它的文件放大器;编辑)添加MenuItem的顶层节点(可以说文件)对于每个顶级节点循环子节点(为前,新建,打开)添加MenuItem的新建/打开父文件节点onclick属性为基础的新创建的菜单项目,创建事件处理器。呼叫使用递归逻辑的步骤2a和向下钻取到N水平,即循环,直到你到达终点节点。检索生成的菜单句柄分配生成的菜单处理Me.Menu财产,以显示在表格菜单。
GenerateMenusFromXML方法是调用递归为每个节点的ChildNodes是否存在为每个节点,如果子节点存在,那么它将作为一个MenuItem补充,并进一步深入,直到它不返回任何的ChildNodes。
您可以加入更多的元素/节点的XML文件,您可以根据您的要求生成的菜单元素。 ITSA完全在本质上是动态的,可是没有任何硬编码,它可以支持N -水平(GT文件;打开- GT子菜单等;子菜单- GT)。以来,ITSA可重复使用的组件,它可以被用来在各种应用。参考文献
更多信息,请参阅MSDN上,

回答

评论会员:rachanatj 时间:2011/12/07
真的感谢感谢很多
这是这样一个很好的逻辑..
评论会员:poonams 时间:2011/12/07
本菜单生成是否会与Internet Explorer的所有版本....请答复尽快尽可能

我的ID:rachanatj2004@yahoo.co.in
评论会员:ilovemyindia 时间:2011/12/07
亲爱的主席先生,

我有一些问题,我想在运行time.User中创建菜单,将进入由另一个form.the值的一些值到数据库中,应该出现新的menu.My的后端是MS Access前端VB.net2003
在这之后,如果用户点击菜单上的,它应该disply corrosponding报告。
PLZ答复

poonam
评论会员:uniquekaiser 时间:2011/12/07
尊敬的女士

您好

这是来自印度的开发,如果发现UR问题答PL邮件我


THX:
| keithljarvis
评论会员:游客 时间:2011/12/07
!嗨,我一直在试图修改代码以使用一个MenuStrip根本没有结果...任何人都可以帮助我对这个噘嘴吗?使用一个MenuStrip和ToolStripMenuItem更容易加入更多的元素,如图像,工具提示,等等...谢谢!
vijayalaya
评论会员:游客 时间:2011/12/07
您好,感谢您的代码!你碰巧知道我怎么能有菜单透明,使底层的图形显示通过?,基思