详细概括VB.NET实现动态菜单的方法

VB.NET经过长时间的发展,很多用户都很了解VB.NET实现动态菜单了,这里我发表一下个人理解,和大家讨论讨论。自己写了一个VB.NET实现动态菜单的例子,觉得还不错。例子中用的主要技术有:
◆菜单树的操作
◆treeview的操作
◆利用堆栈实现菜单树与treeview树成员的对应
◆利用委托实现对象与事件的关联

目前成都创新互联公司已为上1000家的企业提供了网站建设、域名、网页空间、网站托管运营、企业网站设计、海拉尔网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

因为我也是初学者,所以有些词汇用得可能不恰当,另外有些理解也可能有偏差。这个例子实现了VB.NET实现动态菜单,用户可以在当前菜单的任意一个节点上添加一个子菜单,并为添加的子菜单添加事件。

例子介绍如下:

首先创建一个 VB.NET winform application

在form中添加一个菜单,取名为:MainItem,随便添加几个菜单项几项。
◆添加一个textbox控件, 取名为:txtNewText
◆添加一个listbox控件, 取名为:lstHandlers
◆添加一个TreeView控件,取名为:tvMenu

具体代码如下(其中有大部分代码为自动生成):

 
 
 
  1. Public Class Form1Class Form1
  2. Inherits System.Windows.Forms.Form
  3. Windows 窗体设计器生成的代码#Region " Windows 窗体设计器生成的代码 "
  4. Public Sub New()Sub New()
  5. MyBase.New()
  6. '该调用是 Windows 窗体设计器所必需的。
  7. InitializeComponent()
  8. '在 InitializeComponent() 调用之后添加任何初始化
  9. End Sub
  10. '窗体重写处置以清理组件列表。
  11. Protected Overloads Overrides Sub Dispose()Sub Dispose(ByVal disposing As Boolean)
  12. If disposing Then
  13. If Not (components Is Nothing) Then
  14. components.Dispose()
  15. End If
  16. End If
  17. MyBase.Dispose(disposing)
  18. End Sub
  19. 'Windows 窗体设计器所必需的
  20. Private components As System.ComponentModel.IContainer
  21. '注意:以下过程是 Windows 窗体设计器所必需的
  22. '可以使用 Windows 窗体设计器修改此过程。
  23. '不要使用代码编辑器修改它。
  24. Friend WithEvents MainMenu As System.Windows.Forms.MainMenu
  25. Friend WithEvents MenuItem1 As System.Windows.Forms.MenuItem
  26. Friend WithEvents MenuItem2 As System.Windows.Forms.MenuItem
  27. Friend WithEvents MenuItem3 As System.Windows.Forms.MenuItem
  28. Friend WithEvents lstHandlers As System.Windows.Forms.ListBox
  29. Friend WithEvents Label3 As System.Windows.Forms.Label
  30. Friend WithEvents tvMenu As System.Windows.Forms.TreeView
  31. Friend WithEvents Label2 As System.Windows.Forms.Label
  32. Friend WithEvents Label1 As System.Windows.Forms.Label
  33. Friend WithEvents txtNewText As System.Windows.Forms.TextBox
  34. Friend WithEvents btnAddItem As System.Windows.Forms.Button
  35. ()> 
    Private Sub InitializeComponent()Sub InitializeComponent()
  36. Me.components = New System.ComponentModel.Container
  37. Me.MainMenu = New System.Windows.Forms.MainMenu(Me.components)
  38. Me.MenuItem1 = New System.Windows.Forms.MenuItem
  39. Me.MenuItem2 = New System.Windows.Forms.MenuItem
  40. Me.MenuItem3 = New System.Windows.Forms.MenuItem
  41. Me.lstHandlers = New System.Windows.Forms.ListBox
  42. Me.Label3 = New System.Windows.Forms.Label
  43. Me.tvMenu = New System.Windows.Forms.TreeView
  44. Me.Label2 = New System.Windows.Forms.Label
  45. Me.Label1 = New System.Windows.Forms.Label
  46. Me.txtNewText = New System.Windows.Forms.TextBox
  47. Me.btnAddItem = New System.Windows.Forms.Button
  48. Me.SuspendLayout()
  49. '
  50. 'MainMenu
  51. '
  52. Me.MainMenu.MenuItems.AddRange
    (New System.Windows.Forms.MenuItem() {Me.MenuItem1, Me.MenuItem2, Me.MenuItem3})
  53. '
  54. 'MenuItem1
  55. '
  56. Me.MenuItem1.Index = 0
  57. Me.MenuItem1.Text = "菜单1"
  58. '
  59. 'MenuItem2
  60. '
  61. Me.MenuItem2.Index = 1
  62. Me.MenuItem2.Text = "菜单2"
  63. '
  64. 'MenuItem3
  65. '
  66. Me.MenuItem3.Index = 2
  67. Me.MenuItem3.Text = "菜单3"
  68. '
  69. 'lstHandlers
  70. '
  71. Me.lstHandlers.ItemHeight = 12
  72. Me.lstHandlers.Location = New System.Drawing.Point(88, 64)
  73. Me.lstHandlers.Name = "lstHandlers"
  74. Me.lstHandlers.Size = New System.Drawing.Size(136, 112)
  75. Me.lstHandlers.TabIndex = 13
  76. '
  77. 'Label3
  78. '
  79. Me.Label3.Location = New System.Drawing.Point(56, 64)
  80. Me.Label3.Name = "Label3"
  81. Me.Label3.Size = New System.Drawing.Size(32, 16)
  82. Me.Label3.TabIndex = 12
  83. Me.Label3.Text = "事件"
  84. '
  85. 'tvMenu
  86. '
  87. Me.tvMenu.Location = New System.Drawing.Point(280, 24)
  88. Me.tvMenu.Name = "tvMenu"
  89. Me.tvMenu.Size = New System.Drawing.Size(152, 152)
  90. Me.tvMenu.TabIndex = 11
  91. '
  92. 'Label2
  93. '
  94. Me.Label2.Location = New System.Drawing.Point(232, 32)
  95. Me.Label2.Name = "Label2"
  96. Me.Label2.Size = New System.Drawing.Size(48, 16)
  97. Me.Label2.TabIndex = 10
  98. Me.Label2.Text = "添加到"
  99. '
  100. 'Label1
  101. '
  102. Me.Label1.Location = New System.Drawing.Point(8, 32)
  103. Me.Label1.Name = "Label1"
  104. Me.Label1.Size = New System.Drawing.Size(80, 16)
  105. Me.Label1.TabIndex = 9
  106. Me.Label1.Text = "新菜单项文字"
  107. '
  108. 'txtNewText
  109. '
  110. Me.txtNewText.Location = New System.Drawing.Point(88, 24)
  111. Me.txtNewText.Name = "txtNewText"
  112. Me.txtNewText.Size = New System.Drawing.Size(136, 21)
  113. Me.txtNewText.TabIndex = 8
  114. '
  115. 'btnAddItem
  116. '
  117. Me.btnAddItem.Location = New System.Drawing.Point(168, 192)
  118. Me.btnAddItem.Name = "btnAddItem"
  119. Me.btnAddItem.Size = New System.Drawing.Size(80, 24)
  120. Me.btnAddItem.TabIndex = 7
  121. Me.btnAddItem.Text = "添加菜单项"
  122. '
  123. 'Form1
  124. '
  125. Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)
  126. Me.ClientSize = New System.Drawing.Size(448, 225)
  127. Me.Controls.Add(Me.lstHandlers)
  128. Me.Controls.Add(Me.Label3)
  129. Me.Controls.Add(Me.tvMenu)
  130. Me.Controls.Add(Me.Label2)
  131. Me.Controls.Add(Me.Label1)
  132. Me.Controls.Add(Me.txtNewText)
  133. Me.Controls.Add(Me.btnAddItem)
  134. MeMe.Menu = Me.MainMenu
  135. Me.Name = "Form1"
  136. Me.Text = "Form1"
  137. Me.ResumeLayout(False)
  138. Me.PerformLayout()
  139. End Sub
  140. #End Region
  141. Private eHandlers(3) As EventHandler '定义事件方法集合
  142. Private Sub ShowHelloWorld()Sub ShowHelloWorld(ByVal sender As System.Object, 
    ByVal e As System.EventArgs)
  143. MessageBox.Show("Hello World!")
  144. End Sub
  145. Private Sub ShowMenuItemText()Sub ShowMenuItemText(ByVal sender As System.Object, 
    ByVal e As System.EventArgs)
  146. Dim mItem As MenuItem
  147. mItem = CType(sender, MenuItem)
  148. MessageBox.Show(mItem.Text)
  149. End Sub
  150. Private Sub ShowMenuItemIndex()Sub ShowMenuItemIndex(ByVal sender As System.Object, 
    ByVal e As System.EventArgs)
  151. Dim mItem As MenuItem
  152. mItem = CType(sender, MenuItem)
  153. MessageBox.Show(mItem.Index)
  154. End Sub
  155. Private Sub ShowCurDateTime()Sub ShowCurDateTime(ByVal sender As System.Object, 
    ByVal e As System.EventArgs)
  156. Dim strDate As String = DateTime.Now.ToString()
  157. MessageBox.Show(strDate)
  158. End Sub
  159. Private Sub MenuItemToNode()Sub MenuItemToNode(ByVal menuItems As Menu.MenuItemCollection, 
    ByVal targetNodes As TreeNodeCollection)
  160. 'TreeNodeCollection 代表一个树结点集合,每一个节点下的儿子节点的集合
  161. 'MenuItemCollection 代表一个菜单项的集合,也是菜单树中某一菜单下的一级子菜单的菜单项的集合
  162. Dim subItem As MenuItem
  163. For Each subItem In menuItems
  164. Dim subNode As New TreeNode(subItem.Text)
  165. If subItem.MenuItems.Count > 0 Then
  166. MenuItemToNode(subItem.MenuItems, subNode.Nodes)'递归处理
  167. End If
  168. targetNodes.Add(subNode)
  169. Next
  170. End Sub
  171. Private Function FindMenuItem()Function FindMenuItem(ByVal selectedNode As TreeNode) As MenuItem
  172. Dim indexStack As New Collections.Stack()'定一个堆栈对象
  173. '将树结点从当前节点一直到根的一条路径压入堆栈
  174. Do Until selectedNode Is Nothing
  175. indexStack.Push(selectedNode.Index)
  176. selectedNodeselectedNode = selectedNode.Parent
  177. Loop
  178. '再利用菜单与treeview树一一对应的特点.根据节点的index,找到对应的菜单项.然后沿着路径找到当前的菜单项
  179. Dim menuItem As MenuItem = MainMenu.MenuItems(indexStack.Pop())
  180. Do Until indexStack.Count = 0
  181. menuItemmenuItem = menuItem.MenuItems(indexStack.Pop())
  182. Loop
  183. '返回当前菜单项
  184. Return menuItem
  185. End Function
  186. Private Sub btnAddItem_Click()Sub btnAddItem_Click(ByVal sender As System.Object, 
    ByVal e As System.EventArgs) Handles btnAddItem.Click
  187. If txtNewText.Text = "" Then Exit Sub
  188. If tvMenu.SelectedNode Is Nothing Then Exit Sub
  189. Dim correspondingMenuItem As MenuItem
  190. Dim newMenuItem As MenuItem
  191. correspondingMenuItem = FindMenuItem(tvMenu.SelectedNode)'将节点转成菜单项
  192. newMenuItem = New MenuItem(txtNewText.Text) '生成新加的菜单项
  193. If lstHandlers.SelectedIndex >= 0 Then
  194. AddHandler newMenuItem.Click, eHandlers(lstHandlers.SelectedIndex) '建立事件的委托
  195. End If
  196. correspondingMenuItem.MenuItems.Add(newMenuItem)'将新菜单加到菜单树中
  197. tvMenu.Nodes.Clear() '清空treeview树
  198. MenuItemToNode(MainMenu.MenuItems, tvMenu.Nodes) '将最新的菜单呈现成树
  199. tvMenu.ExpandAll() '展开树
  200. End Sub
  201. Private Sub Form1_Load()Sub Form1_Load(ByVal sender As System.Object, 
    ByVal e As System.EventArgs) Handles MyBase.Load
  202. MenuItemToNode(MainMenu.MenuItems, tvMenu.Nodes)'将菜单树呈现到treeview中
  203. tvMenu.ExpandAll() '展开他
  204. '将三个事件方法放入集合
  205. eHandlers(0) = AddressOf ShowHelloWorld
  206. eHandlers(1) = AddressOf ShowMenuItemText
  207. eHandlers(2) = AddressOf ShowMenuItemIndex
  208. eHandlers(3) = AddressOf ShowCurDateTime
  209. '将事件方法名字写入列表
  210. Dim i As Integer
  211. For i = 0 To eHandlers.Length - 1
  212. lstHandlers.Items.Add(eHandlers(i).Method.Name)
  213. Next
  214. End Sub
  215. End Class

新闻标题:详细概括VB.NET实现动态菜单的方法
分享网址:http://www.shufengxianlan.com/qtweb/news2/220002.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联