<转>通过反射获取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中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的 ...
随机推荐
- UIAutomatorViewer增加xpath查看
原来的UIAutomatorViewer是没有xpath查看路径的,下载如下jar包: https://pan.baidu.com/s/1jpr6m0OOce7CtnDE_lIJ9A 密码:cja0 ...
- 课程四(Convolutional Neural Networks),第二 周(Deep convolutional models: case studies) —— 0.Learning Goals
Learning Goals Understand multiple foundational papers of convolutional neural networks Analyze the ...
- IdentityServer4之SSO(基于OAuth2.0、OIDC)单点登录、登出
IdentityServer4之SSO(基于OAuth2.0.OIDC)单点登录.登出 准备 五个Web站点: 1.localhost:5000 : 认证服务器.2 ...
- MongoDB 常用的几大GUI工具
MongoDB 常用的几大GUI工具 MongoDBCompass (官方的连接工具),免费的,界面简洁,不支持 sql 查询,支持性能监控.支持在三大平台 Windows .Mac .Linux 上 ...
- Windows10安装Docker
一.Docker下载安装 一般情况下,我们可以从Docker官网docker下载安装文件,但是官方网站由于众所周知的原因,不是访问慢,就是下载慢.下载docker安装包动不动就要个把小时,真是极大的影 ...
- lightswitch Grid 控件添加 CheckBox 多选
ACTIVATING MULTI SELECTION WITH CHECKBOXES IN A LIGHTSWITCH GRID WITH A ONE-LINER 2013/04/02 · by pa ...
- N最短路径分词
N最短路径算法是一种基于词典的分词算法. 每个句子将生成一个有向无环图, 每个字作为图的一个定点, 边代表可能的分词. 在上图中, 边的起点为词的第一个字, 边的终点为词尾的下一个字. 边1表示&qu ...
- S3C2440 DMA 驱动示例
将 DMA 抽象为一个字符设备,在初始化函数中调用 void *dma_alloc_writecombine(struct device *dev, size_t size, dma_addr_t * ...
- Linux进程间通信(System V) --- 共享内存
共享内存 IPC 原理 共享内存进程间通信机制主要用于实现进程间大量的数据传输,下图所示为进程间使用共享内存实现大量数据传输的示意图: 共享内存是在内存中单独开辟的一段内存空间,这段内存空间有自己特有 ...
- [转]Angular4 自制分页控件
本文转自:https://blog.csdn.net/Junyuan_123/article/details/79486276 过年后第一波,自制的分页控件,可能功能没有 PrimeNG 那么好,但是 ...