1. private void button1_Click(object sender, EventArgs e)
  2. {
  3. treeView1.Nodes.Clear();
  4. Assembly a = Assembly.LoadFile(Application.ExecutablePath);
  5. Type[] types = a.GetTypes();
  6. foreach (Type t in types)
  7. {
  8. if (t.BaseType.Name == "Form") //遍历窗体
  9. {
  10. Form f = (Form)Activator.CreateInstance(t, true);
  11. if (f != null)
  12. {
  13. TreeNode node = new TreeNode();
  14. node.Name = f.Name;
  15. node.Text = f.Text;
  16. treeView1.Nodes.Add(node);
  17. FindControl(f, node); //根据窗体遍历菜单栏及工具栏
  18. Form fm=(Form)f;
  19. FindContextControl(fm, node); //根据窗体遍历弹出式菜单
  20. }
  21. }
  22. }
  23. }
  24.  
  25. //遍历弹出式菜单
  26. public void FindContextControl(Form f, TreeNode pcnode)
  27. {
  28. System.Reflection.FieldInfo[] fieldinfo = f.GetType().GetFields(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
  29. for (int i = 0; i < fieldinfo.Length; i++)
  30. {
  31. switch (fieldinfo[i].FieldType.Name)
  32. {
  33. case "ContextMenuStrip":
  34. ContextMenuStrip context = (ContextMenuStrip)fieldinfo[i].GetValue(f);
  35. foreach (ToolStripMenuItem tsmi in context.Items)
  36. {
  37. TreeNode tsminode = new TreeNode();
  38. tsminode.Name = tsmi.Name;
  39. tsminode.Text = tsmi.Text;
  40. pcnode.Nodes.Add(tsminode);
  41. }
  42. break;
  43. default:
  44. break;
  45. }
  46. }
  47. }
  48. public void FindControl(Control ctrl, TreeNode Pnode)
  49. {
  50. foreach (Control c in ctrl.Controls)
  51. {
  52. if (c is MenuStrip) //遍历菜单栏
  53. {
  54. MenuStrip menu = (MenuStrip)c;
  55. foreach (ToolStripMenuItem menuitem2 in menu.Items)
  56. {
  57. TreeNode cnode = new TreeNode();
  58. cnode.Name = menuitem2.Name;
  59. cnode.Text = menuitem2.Text;
  60. if (menuitem2.DropDownItems.Count > 0)
  61. {
  62. for (int i = 0; i < menuitem2.DropDownItems.Count; i++)
  63. {
  64. TreeNode tnode = new TreeNode();
  65. tnode.Name = menuitem2.DropDownItems[i].Name;
  66. tnode.Text = menuitem2.DropDownItems[i].Text;
  67. cnode.Nodes.Add(tnode);
  68. }
  69. }
  70. Pnode.Nodes.Add(cnode);
  71. }
  72. }
  73. else if (c is ToolStrip) //遍历工具栏
  74. {
  75. ToolStrip tool = (ToolStrip)c;
  76. foreach (ToolStripItem item in tool.Items)
  77. {
  78. if (item is ToolStripButton)
  79. {
  80. TreeNode ttnode = new TreeNode();
  81. ttnode.Name = item.Name;
  82. ttnode.Text = item.Text;
  83. Pnode.Nodes.Add(ttnode);
  84. }
  85. else if (item is ToolStripDropDownButton )
  86. {
  87. ToolStripDropDownButton tdb = (ToolStripDropDownButton)item;
  88. TreeNode twnode = new TreeNode();
  89. twnode.Name = tdb.Name;
  90. twnode.Text = tdb.Text;
  91. if (tdb.DropDownItems.Count > 0)
  92. {
  93. for (int i = 0; i < tdb.DropDownItems.Count; i++)
  94. {
  95. TreeNode tn = new TreeNode();
  96. tn.Name = tdb.DropDownItems[i].Name;
  97. tn.Text = tdb.DropDownItems[i].Text;
  98. twnode.Nodes.Add(tn);
  99. }
  100. }
  101. Pnode.Nodes.Add(twnode);
  102. }
  103. }
  104. }
  105. }
  106. }

转自:http://liujb1982.blog.163.com/blog/static/114911572201011162327637/

<转>通过反射获取Form/MenuStrip/ContextMenuStrip等列表的更多相关文章

  1. 反射获取窗体所有控件的Text

    可以直接通过反射获取当前窗体的所有控件的Text(具有Text属性),具体代码如下: foreach (var field in form.GetType().GetFields(System.Ref ...

  2. Atitit利用反射获取子类 集合 以及继承树

    Atitit利用反射获取子类 集合 以及继承树 想从父类往下找子类的确是不可能的,要知道只要类不是final的话谁都有继承它的自由不需要事前通知父类. Eclipse实现不是重父类开始找而是重子类往回 ...

  3. java 通过反射获取调用类方法及属性

    首先说下反射是什么?反射是Sun公司推出的一组API,此组API位于Java.lang.reflect中 反射的作用是编写工具(例如eclipse),编写框架,当然对于一般的程序,我们不可能用反射来做 ...

  4. C#中使用反射获取结构体实例

    一般用反射获取类对象的实例比较简单,只要类有一个无参构造函数或没有显示声明带参的构造函数即可使用如下代码 static void Main(string[] args) { Type type = t ...

  5. java 27 - 4 反射之 通过反射获取成员变量并使用

    类Field: 提供有关类或接口的单个字段的信息,以及对它的动态访问权限. A:获得类的成员变量 数组: 1.getFields(公共类的) 2.getDeclaredFields(所有类型的) B: ...

  6. java 27 - 3 反射之 通过反射获取构造方法并使用

    类 Constructor<T>:提供关于类的单个构造方法的信息以及对它的访问权限. 通过反射的方法获取构造方法并使用  ps:先忽略泛型 A.1:获取构造方法的数组: public Co ...

  7. 通过反射获取SSM的controller层的注解以及注解中的value值

    package com.reflection.test; import java.lang.annotation.Annotation; import java.lang.reflect.Invoca ...

  8. java中的反射机制,以及如何通过反射获取一个类的构造方法 ,成员变量,方法,详细。。

    首先先说一下类的加载,流程.只有明确了类这个对象的存在才可以更好的理解反射的原因,以及反射的机制. 一.  类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三 ...

  9. c#反射机制学习和利用反射获取类型信息

    反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的 ...

随机推荐

  1. JAVA获取运行环境的信息

    System.getProperties().list(System.out); 得到运行环境的信息

  2. salesforce lightning零基础学习(九) Aura Js 浅谈二: Event篇

    上一篇介绍了Aura Framework中 Component类的部分方法,本篇将要介绍Event常用的方法. 1. setParam (String key , Object value):设置事件 ...

  3. 从零开始学 Web 之 JavaScript(五)面向对象

    大家好,这里是「 Daotin的梦呓 」从零开始学 Web 系列教程.此文首发于「 Daotin的梦呓 」公众号,欢迎大家订阅关注.在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识 ...

  4. 正则表达式之javascript

    1.正则表达式的定义 描述字符模式的对象,JavaScript的RepExp类表示正则表达式 var pattern = new RegExp("s\("); <=> ...

  5. 分布式版本控制系统GIT的使用

    一.什么是Git Git是一个分布式版本控制系统,Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异(如CVS.Subver ...

  6. Java入门 第10天 ,理解数组

    数组的特点: 1.内容的类型固定,不会int String 两个类型一起,要么是int类型 要么是String类型 或者其他类型. 2.长度是固定的,例:String [ ]   myArray  = ...

  7. HDU5543(SummerTrainingDay03-O DP)

    Pick The Sticks Time Limit: 15000/10000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others ...

  8. linux下安装apache环境

    Centos6.5  64位下安装apache php mysql(安装包版本一定要正确,网上很多都不准,不要用32位的安装包装再64位上,后期有很多问题,下载安装后一定要检出版本,有的网友操蛋,把3 ...

  9. REM在edge浏览器中不重新计算解决

    经过多分析和排查,此问题解决的方案 第一种: 在CSS样式中添加 body { font-size:100% } 如果不起作用,可以尝试将引用的REMjs放在head内引用

  10. video自动禁止全屏

    在微信浏览器.苹果等其他浏览器,里面使用video标签,会自动变成全屏,改成下面就好了,起码可以在video标签之上加入其他元素    webkit-playsinline playsinline x ...