<转>通过反射获取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中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的 ...
随机推荐
- Ubuntu16.04安装Anaconda (转)
一. Anaconda下载 Anaconda 官方下载链接: https://www.continuum.io/downloads 根据自己的系统选择下载32位还是64位. 二. 进入下载目录 如 ...
- html css 其他常用 onclick跳转
opacity: 0.5. 0-1 透明度 cursor: pointer;手指 clear:both 清楚浮动 我是医生不是人 文本内容超出框word-wrap:break-word; word-b ...
- SpringBoot一站式启动流程源码分析
一.前言 由上篇文章我们得知,SpringBoot启动时,就是有很简单的一行代码.那我们可以很清楚的看到这行代码的主角便是SpringApplication了,本文我们就来聊一聊这货,来探寻Sprin ...
- Http怎么处理长连接
http协议中有和keep alive特性,这个在http1.1中有, 可以保持浏览器和服务器之间保持着长连接,http本身是无连接的协议, 通过tcp实现数据的传输,处理长连接要注意什么时候数据服务 ...
- php获取父目录的方法 dirname()
dirname() 方法,获取父目录的方法,官方文档:http://php.net/manual/en/function.dirname.php 在 php 7.0 后,dirname() 支持两个参 ...
- ProxySQL Cluster 高可用集群环境部署记录
ProxySQL在早期版本若需要做高可用,需要搭建两个实例,进行冗余.但两个ProxySQL实例之间的数据并不能共通,在主实例上配置后,仍需要在备用节点上进行配置,对管理来说非常不方便.但是Proxy ...
- 【CSS学习】--- z-index属性
一.前言 网页显示实际上是三维的,我们直观看到的有x轴和y轴,但在网页布局上还有一个z轴. 对于定位元素,我们使用top.right.left.bottom来实现元素在x-y平面上的定位,但为了表示布 ...
- cJSON填坑记
1. 艰辛的过程 最近做了一个嵌入式的项目,需要与服务器进行连接.为了方便服务器处理数据,经商定后统一采用JSON形式进行数据的传输. 以前没有用过JSON格式进行数据处理,所以上网搜索了一下,很多人 ...
- spring cloud config与eureka配合使用
前面两篇介绍了Spring Cloud Config服务端和客户端的简单配置,本篇介绍Spring Cloud Config与Eureka配合使用 前言 默认情况下,配置客户端启动时,都是通过配置属性 ...
- hadoop fs,hadoop dfs,hdfs dfs
hadoop fs: FS relates to a generic file system which can point to any file systems like local, HDFS ...