<转>通过反射获取Form/MenuStrip/ContextMenuStrip等列表
private void button1_Click(object sender, EventArgs e)
{
treeView1.Nodes.Clear();
Assembly a = Assembly.LoadFile(Application.ExecutablePath);
Type[] types = a.GetTypes();
foreach (Type t in types)
{
if (t.BaseType.Name == "Form") //遍历窗体
{
Form f = (Form)Activator.CreateInstance(t, true);
if (f != null)
{
TreeNode node = new TreeNode();
node.Name = f.Name;
node.Text = f.Text;
treeView1.Nodes.Add(node);
FindControl(f, node); //根据窗体遍历菜单栏及工具栏
Form fm=(Form)f;
FindContextControl(fm, node); //根据窗体遍历弹出式菜单
}
}
}
} //遍历弹出式菜单
public void FindContextControl(Form f, TreeNode pcnode)
{
System.Reflection.FieldInfo[] fieldinfo = f.GetType().GetFields(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
for (int i = 0; i < fieldinfo.Length; i++)
{
switch (fieldinfo[i].FieldType.Name)
{
case "ContextMenuStrip":
ContextMenuStrip context = (ContextMenuStrip)fieldinfo[i].GetValue(f);
foreach (ToolStripMenuItem tsmi in context.Items)
{
TreeNode tsminode = new TreeNode();
tsminode.Name = tsmi.Name;
tsminode.Text = tsmi.Text;
pcnode.Nodes.Add(tsminode);
}
break;
default:
break;
}
}
}
public void FindControl(Control ctrl, TreeNode Pnode)
{
foreach (Control c in ctrl.Controls)
{
if (c is MenuStrip) //遍历菜单栏
{
MenuStrip menu = (MenuStrip)c;
foreach (ToolStripMenuItem menuitem2 in menu.Items)
{
TreeNode cnode = new TreeNode();
cnode.Name = menuitem2.Name;
cnode.Text = menuitem2.Text;
if (menuitem2.DropDownItems.Count > 0)
{
for (int i = 0; i < menuitem2.DropDownItems.Count; i++)
{
TreeNode tnode = new TreeNode();
tnode.Name = menuitem2.DropDownItems[i].Name;
tnode.Text = menuitem2.DropDownItems[i].Text;
cnode.Nodes.Add(tnode);
}
}
Pnode.Nodes.Add(cnode);
}
}
else if (c is ToolStrip) //遍历工具栏
{
ToolStrip tool = (ToolStrip)c;
foreach (ToolStripItem item in tool.Items)
{
if (item is ToolStripButton)
{
TreeNode ttnode = new TreeNode();
ttnode.Name = item.Name;
ttnode.Text = item.Text;
Pnode.Nodes.Add(ttnode);
}
else if (item is ToolStripDropDownButton )
{
ToolStripDropDownButton tdb = (ToolStripDropDownButton)item;
TreeNode twnode = new TreeNode();
twnode.Name = tdb.Name;
twnode.Text = tdb.Text;
if (tdb.DropDownItems.Count > 0)
{
for (int i = 0; i < tdb.DropDownItems.Count; i++)
{
TreeNode tn = new TreeNode();
tn.Name = tdb.DropDownItems[i].Name;
tn.Text = tdb.DropDownItems[i].Text;
twnode.Nodes.Add(tn);
}
}
Pnode.Nodes.Add(twnode);
}
}
}
}
}
转自:http://liujb1982.blog.163.com/blog/static/114911572201011162327637/
<转>通过反射获取Form/MenuStrip/ContextMenuStrip等列表的更多相关文章
- 反射获取窗体所有控件的Text
可以直接通过反射获取当前窗体的所有控件的Text(具有Text属性),具体代码如下: foreach (var field in form.GetType().GetFields(System.Ref ...
- Atitit利用反射获取子类 集合 以及继承树
Atitit利用反射获取子类 集合 以及继承树 想从父类往下找子类的确是不可能的,要知道只要类不是final的话谁都有继承它的自由不需要事前通知父类. Eclipse实现不是重父类开始找而是重子类往回 ...
- java 通过反射获取调用类方法及属性
首先说下反射是什么?反射是Sun公司推出的一组API,此组API位于Java.lang.reflect中 反射的作用是编写工具(例如eclipse),编写框架,当然对于一般的程序,我们不可能用反射来做 ...
- C#中使用反射获取结构体实例
一般用反射获取类对象的实例比较简单,只要类有一个无参构造函数或没有显示声明带参的构造函数即可使用如下代码 static void Main(string[] args) { Type type = t ...
- java 27 - 4 反射之 通过反射获取成员变量并使用
类Field: 提供有关类或接口的单个字段的信息,以及对它的动态访问权限. A:获得类的成员变量 数组: 1.getFields(公共类的) 2.getDeclaredFields(所有类型的) B: ...
- java 27 - 3 反射之 通过反射获取构造方法并使用
类 Constructor<T>:提供关于类的单个构造方法的信息以及对它的访问权限. 通过反射的方法获取构造方法并使用 ps:先忽略泛型 A.1:获取构造方法的数组: public Co ...
- 通过反射获取SSM的controller层的注解以及注解中的value值
package com.reflection.test; import java.lang.annotation.Annotation; import java.lang.reflect.Invoca ...
- java中的反射机制,以及如何通过反射获取一个类的构造方法 ,成员变量,方法,详细。。
首先先说一下类的加载,流程.只有明确了类这个对象的存在才可以更好的理解反射的原因,以及反射的机制. 一. 类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三 ...
- c#反射机制学习和利用反射获取类型信息
反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的 ...
随机推荐
- app自动化测试之实战应用(魅族计算器)
模拟魅族计算器加法计算: from appium import webdriver desired_caps = {} desired_caps['deviceName'] = '621QECQ23D ...
- odoo开发笔记 -- 多对多字段追加数据
正常赋值操作: (以某个模型对象的附件为例) , , attach_ids)] 其中,attach_ids为附件对象id列表. 追加更新操作: 直接追加方式,没有找到;间接实现,每次更新前,去查询附件 ...
- [转]idea导入eclipse的web项目
https://www.cnblogs.com/xiaoBlog2016/archive/2017/05/08/6825014.html 一.导入自己的web项目 步骤:File->New-&g ...
- Apache Commons Beanutils 二 (动态Bean - DynaBeans)
相关背景 上一篇介绍了PropertyUtils的用法,PropertyUtils主要是在不修改bean结构的前提下,动态访问bean的属性: 但是有时候,我们会经常希望能够在不定义一个Java类的前 ...
- MySQL修改表、字段、库的字符集及字符集说明
修改数据库字符集: ALTER DATABASE db_name DEFAULT CHARACTER SET character_name [COLLATE ...]; 把表默认的字符集和所有字符列( ...
- 在C#中,如何连接已加密的Sqlite数据库
对数据加密分两种,一种是对数据库本身进行加密,另一种是对数据表中的数据进行加密, 如果SQLite数据库加密,我这里使用的一个管理工具叫SQLiteDeveloper,如下就可以加密数据库 , 如果在 ...
- ASP.NET上传时间超过4M失败(超时)的解决方法
https://blog.csdn.net/shan1774965666/article/details/20836851 在web.config中的<system.web></sy ...
- 【Java】模拟Sping,实现其IOC和AOP核心(一)
在这里我要实现的是Spring的IOC和AOP的核心,而且有关IOC的实现,注解+XML能混合使用! 参考资料: IOC:控制反转(Inversion of Control,缩写为IoC),是面向对象 ...
- Java基础——Servlet(八)文件上传下载
一.简单的文件上传常见的组件Smartupload , Apache 的 commons FileUploadSmartupload上传的步骤: 1.初始化上传上下文 2.准备上传 3.保存文件 &l ...
- java导出excel时合并同一列中相同内容的行
一.有时候导出Excel时需要按类别导出,一大类下好几个小类,小类下又有好几个小小类,就像下图: 要实现这个也不难, 思路如下:按照大类来循环,如上就是按照张江校区.徐汇校区.临港校区三个大类循环,然 ...