WinForm中通过反射遍历程序中的窗体及窗体上的控件

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);
                        }
                      }
                }
            }
        }

转载于:https://www.cnblogs.com/szqizh/archive/2012/10/17/2727230.html

你可能感兴趣的:(WinForm中通过反射遍历程序中的窗体及窗体上的控件)