<转>通过反射获取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中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的 ...
随机推荐
- Neo4j学习笔记
1. 环境搭建 正好最近同学有一台阿里云服务器借我玩,就尝试着在服务器上搭了Neo4j. 环境:CentOS Linux release 7.4.1708 (Core) 安装Java 安装Neo4j需 ...
- (转)Linux开启路由转发功能
原文:https://www.linuxidc.com/Linux/2016-12/138661.htm 标记一下,今天想让一台Red Hat Enterprise Linux 7开通iptables ...
- SqlServer 循环建表、删除表、更新表
常用于分库分表 1.批量删除 declare @outter int declare @inner int ) ) ) begin set @tablePrefix='BankPayOrder_'+c ...
- SSM整合(四)-整合后配置文件汇总
1.新建Maven项目创建pom.xml pom.xml内容如下 <project xmlns="http://maven.apache.org/POM/4.0.0" xml ...
- 《Kubernetes权威指南》——Kubelet运行机制与安全机制
1 Kubelet运行机制 Kubenetes集群中的每个Node节点都会启动一个Kubelet服务进程用于处理Master下发到该节点的任务,管理Pod及其中的容器 Kubelet进程在API Se ...
- 理解极大似然估计(MLE)
极大似然估计学习时总会觉得有点不可思议,为什么可以这么做,什么情况才可以用极大似然估计.本文旨在通俗理解MLE(Maximum Likelihood Estimate). 一.极大似然估计的思想与举例 ...
- 通过证书请求Https站点
前几天在做与平安银行对接接口,主要是给平安银行推送用户数据(申请贷款的用户),平安银行提供的是https的地址,请求https地址的时候还要发送证书,刚接到这个任务的时候一头雾水,百度上各种所搜,最后 ...
- Baffle.js – 用于实现文本模糊效果的 JavaScript 库
Baffle.js 是一个 JavaScript 库,设计用来模糊和揭开DOM元素的文本. 这些元素可以是一个 CSS 选择器的形式.一个节点列表或者一个单节点. 你也可以传递一个选择对象给插件. 在 ...
- SSH原理和应用
SSH(Secure SHell)是为远程登录, 远程通信等设计的安全通信协议, 由芬兰研究员于1995年提出,其目的是用于替代非安全的Telnet.rsh.rexec等不安全的远程Shell协议. ...
- Struts2之类型转换
jsp提交的数据全部是String类型,Struts2也是通过request.getParameter(name)取得String类型的数据,并通过拦截器将String转换成各种类型的数据,然后通过g ...