如何获得菜单名称?

zhhot 2005-10-20 04:32:03
我想把窗体上的菜单.name和菜单.text都Msgbox出来。代码如下
Private Sub clsMenu(ByVal objMenu As Object)
Dim ctrMenu As System.Windows.Forms.MenuItem
For Each ctrMenu In objMenu.MenuItems
If ctrMenu.IsParent Then
clsMenu(ctrMenu)
End If
If ctrMenu.Visible = True And ctrMenu.Text <> "-" Then
MsgBox(ctrMenu.Name & ctrMenu.Text)
End If
Next
End Sub

可是ctrMenu.Name属性不存在阿,怎么才能获得菜单的Name属性呢?
PS:事例菜单 文件 mnu0
打开 mnu1
关闭 mnu2
我要获得name mnu0
...全文
303 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
水如烟 2005-10-21
  • 打赏
  • 举报
回复
哈,总想没有做不到的,就怕想不到.
水如烟 2005-10-21
  • 打赏
  • 举报
回复
可以根据菜单名称得到菜单对象
水如烟 2005-10-21
  • 打赏
  • 举报
回复
须Imports System.Reflection, System.ComponentModel
水如烟 2005-10-21
  • 打赏
  • 举报
回复
供参考:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim t As Type = Me.GetType
For Each f As FieldInfo In t.GetFields(BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.Public)
If f.FieldType.Name.Equals("MenuItem") Then
Console.WriteLine("MenuItem Name: {0}, Text: {1}", f.Name.Substring(1), CType(f.GetValue(Me), MenuItem).Text)
End If
Next
End Sub
zhhot 2005-10-21
  • 打赏
  • 举报
回复
多谢大家帮助!多谢hamadou(闵峰)的重写menuitem意见
多谢lzmtw(水如烟)的事例!多谢您那些共享资源!
水如烟 2005-10-21
  • 打赏
  • 举报
回复
总结部分在我BLOG上,博客园的,没法.CSDN的贴代码不方便.

HOW TO:菜单名称有关操作
http://lzmtw.cnblogs.com/
水如烟 2005-10-21
  • 打赏
  • 举报
回复
还是先给一部分吧:

''' -----------------------------------------------------------------------------
''' <summary>
''' 依据菜单名称返回菜单对象
''' </summary>
''' <param name="FormIstance">窗体实例</param>
''' <param name="MenuItemName">菜单名称</param>
''' <returns>菜单</returns>
''' <remarks>
''' </remarks>
''' <history>
''' [lzmtw] 2005-10-21 Created
''' </history>
''' -----------------------------------------------------------------------------
Private Function GetMenuItemByName(ByVal FormIstance As Form, ByVal MenuItemName As String) As MenuItem
Dim FindBinding As System.Reflection.BindingFlags
FindBinding = BindingFlags.Instance Or BindingFlags.NonPublic Or BindingFlags.Public
Dim MenuItemFieldInfo As System.Reflection.FieldInfo
MenuItemFieldInfo = FormIstance.GetType.GetField("_" & MenuItemName, FindBinding)
If MenuItemFieldInfo Is Nothing Then
Return Nothing
Else
Return CType(MenuItemFieldInfo.GetValue(FormIstance), MenuItem)
End If
End Function

''' -----------------------------------------------------------------------------
''' <summary>
''' 给出菜单对象返回菜单名称
''' </summary>
''' <param name="FormIstance">窗体实例</param>
''' <param name="MenuItem">菜单</param>
''' <returns>菜单名称</returns>
''' <remarks>
''' </remarks>
''' <history>
''' [lzmtw] 2005-10-21 Created
''' </history>
''' -----------------------------------------------------------------------------
Private Function GetMenuItemName(ByVal FormIstance As Form, ByVal MenuItem As MenuItem) As String
Dim FindBinding As System.Reflection.BindingFlags
FindBinding = BindingFlags.Instance Or BindingFlags.NonPublic Or BindingFlags.Public
Dim MenuItemFieldInfo As System.Reflection.FieldInfo
For Each MenuItemFieldInfo In FormIstance.GetType.GetFields(FindBinding)
If MenuItemFieldInfo.GetValue(FormIstance) Is MenuItem Then
Return MenuItemFieldInfo.Name.Substring(1)
End If
Next
Return String.Empty
End Function
水如烟 2005-10-21
  • 打赏
  • 举报
回复
你还在的话稍等一下,我总结一下
redwrite 2005-10-21
  • 打赏
  • 举报
回复
to lzmtw(水如烟)
我试了一下,好像不行
AntingZ 2005-10-20
  • 打赏
  • 举报
回复
用闵峰说的重写menuitem,公开一个属性可以实现
好像vb2005中可以取name属性了
水如烟 2005-10-20
  • 打赏
  • 举报
回复
菜单这玩意儿没研究过,看一看
cansum396 2005-10-20
  • 打赏
  • 举报
回复
楼上说的是
hamadou 2005-10-20
  • 打赏
  • 举报
回复
可以通过让menuitem的name与tag属性相同从而通过得到tag来获得!
或者你重写menuitem,然后暴露一个这么的属性,其实他记录的内容就是menuitem的name

16,718

社区成员

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

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