这个案例是一个基于VS2005的WinForm菜单控件的例子,功能是从XML中动态加载菜单数据到MenuTrip控件上。这个案例中用到了XML,反射之类的技术。当然实用价值有限,仅供学习参考之用。
  首先创建一个WinForm项目,在Form1上放置一个MenuTrip控件,将其命名为MainMenu。
  在项目中添加一个XML文件,命名为Menu.xml,代码如下:
  MenuXml
1<?xml version="1.0" encoding="utf-8" ?>
2<Menus>
3 <MainMenu id="10" title="文件">
4  <SubMenu id="101">
5   <Title>打开文件</Title>
6  </SubMenu>
7  <SubMenu id="102">
8   <Title>关闭文件</Title>
9  </SubMenu>
10 </MainMenu>
11 <MainMenu id="11" title="编辑">
12  <SubMenu id="111">
13   <Title>剪切</Title>
14  </SubMenu>
15  <SubMenu id="112">
16   <Title>复制</Title>
17  </SubMenu>
18  <SubMenu id="113">
19   <Title>粘贴</Title>
20  </SubMenu>
21 </MainMenu>
22</Menus>
23
  接着往项目中再添加一个Menu.cs类,用来完成菜单的读取等相关操作,代码如下:
  XMLCode
 1using System;
 2using System.Collections.Generic;
 3using System.Text;
 4using System.Windows.Forms;
 5using System.Xml;
 6using System.IO;
 7using System.Reflection;
 8
 9namespace WindowsApplication1
10{
11  /** <summary>
12  /// 菜单读取类
13  /// </summary>
14  public class Menu
15  {
16    private string _Path;
17
18    /** <summary>
19    /// 设置XML配置文件路径
20    /// </summary>
21    public string Path
22    {
23      get { return _Path; }
24      set { _Path = value; }
25    }
26
27    /** <summary>
28    /// 判断文件是否存在
29    /// </summary>
30    /// <returns>文件是否存在</returns>
31    public bool FileExit()
32    {
33      if (File.Exists(_Path))
34      { return true; }
35      else return false;
36    }
37   
38    /** <summary>
39    /// 加载菜单
40    /// </summary>
41    /// <param name="menuStrip">母菜单对象</param>
42    public void LoadAllMenu(MenuStrip menuStrip)
43    {
44      //读取XML配置文件
45      XmlTextReader xmlReader = new XmlTextReader(_Path);
46      while (xmlReader.Read())
47      {
48        //判断是否循环到MainMenu节点
49        if (!xmlReader.IsEmptyElement && xmlReader.Name == "MainMenu")
50        {
51          //创建一级菜单项
52          ToolStripMenuItem toolItem = new ToolStripMenuItem();
53          //获取属性ID值
54          string id = xmlReader.GetAttribute("id");
55          toolItem.Name = "Item" + id;
56          //获取属性TITLE值
57          string title = xmlReader.GetAttribute("title");
58          toolItem.Text = title;
59          if (title != null && title.Length > 1)
60          {
61            //动态添加一项菜单
62            menuStrip.Items.Add(toolItem);
63          }
64        }
65        //判断是否到子菜单节点
66        else if (!xmlReader.IsEmptyElement && xmlReader.Name == "SubMenu")
67        {
68          //创建子菜单对象
69          ToolStripMenuItem toolSubItem = new ToolStripMenuItem();
70          string id = xmlReader.GetAttribute("id");
71          toolSubItem.Name = "Item" + id;
72          //获取子菜单树
73          XmlReader xmlSubReader = xmlReader.ReadSubtree();
74          MenuMethod menuMethod = new MenuMethod();
75          while (xmlSubReader.Read())
76          {
77            if (!xmlSubReader.IsEmptyElement && xmlSubReader.Name == "Title")
78            {
79              //添加子菜单的文字
80              toolSubItem.Text = xmlSubReader.ReadElementString();
81              //为菜单添加单击事件
82              toolSubItem.Click += new EventHandler(toolSubItem_Click);
83            }
84            //获取母菜单对象
85            ToolStripMenuItem toolStripMenuItem = (ToolStripMenuItem)menuStrip.Items["Item" + id.Substring(0, 2)];
86            //添加子菜单
87            toolStripMenuItem.DropDownItems.Add(toolSubItem);
88          }
89        }
90      }
91    }
92
93    void toolSubItem_Click(object sender, EventArgs e)
94    {
95      //创建菜单调用方法类的实例
96      MenuMethod menuMethod=new MenuMethod();
97      Type type = menuMethod.GetType();
98      //动态获取方法对象
99      MethodInfo mi = type.GetMethod(((ToolStripMenuItem)sender).Name);
100      //调用指定方法
101      mi.Invoke(menuMethod, null);
102      
103    }
104  }
105}
106
  另外再添加一个类,命名为MenuMethod.cs,该方法定义了每个菜单项在加载后单击事件所调用的方法。代码如下:
  MenuMethod
1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.Windows.Forms;
5
6namespace WindowsApplication1
7{
8  /** <summary>
9  /// 菜单的方法列表类
10  /// </summary>
11  class MenuMethod
12  {
13    public void Item101()
14    {
15      MessageBox.Show("方法1");
16    }
17
18    public void Item102()
19    {
20      MessageBox.Show("方法2");
21    }
22
23    public void Item111()
24    {
25      MessageBox.Show("方法3");
26    }
27
28    public void Item112()
29    {
30      MessageBox.Show("方法4");
31    }
32
33    public void Item113()
34    {
35      MessageBox.Show("方法5");
36    }
37  }
38}
39最后在Form1.cs的Load方法中填写如下代码:
  MainCode
1private void Form1_Load(object sender, EventArgs e)
2{
3  Menu menu = new Menu();
4  menu.Path = "http://www.cnblogs.com/Menu.xml";
5  if (menu.FileExit())
6  { menu.LoadAllMenu(MainMenu); }
7  else
8  { MessageBox.Show("XML文件加载失败!"); }
9}
10

XML 与动态添加控件相关推荐

  1. 动态添加综合布局---动态添加控件及将某XML动态加入到Activity显示(续)

    前言:以前曾写过一篇关于动态生成控件的文章<动态添加控件及将某XML动态加入到Activity显示>,比较浅显,对于RelativeLayout的相关布局设置方法及相对布局与线性布局的混合 ...

  2. 动态添加控件及将某XML动态加入到Activity显示

    一.动态添加控件.设置参数 这个难度比较大,放在前面讲,用的也比较多,普通情况下,我们会提前把布局XML写好,然后对XML中的元素进行设置,但这种方法在有些情况下就显得不适合,比较聊天应用,比如帖子的 ...

  3. asp.net动态添加控件学习

    看了老师的教程后,自己一点感悟记录下来: 1.在页面提交后,动态生成的控件会丢失, 但如果生成控件的代码在pageload中,就可以,原理是每次生成页面都执行生成. 2.动态按件或页面原来控件, 在页 ...

  4. jQuery EasyUI动态添加控件或者ajax加载页面后不能自动渲染问题的解决方法

    博客分类: jquery-easyui jQueryAjax框架HTML  现象: AJAX返回的html无法做到自动渲染为EasyUI的样式.比如:class="easyui-layout ...

  5. 关于页面动态添加控件(转)

    最近看到很多问题都是关于页面动态添加控件,页面postback以后,就取不到这些控件了.其实每次在页面上动态添加控件(或者在数据控件上动态添加列),它们的状态是不会被添加到页面的ViewState中去 ...

  6. Android 在布局容器中动态添加控件

    这里,通过一个小demo,就可以掌握在布局容器中动态添加控件,以动态添加Button控件为例,添加其他控件同样道理. 1.addView 添加控件到布局容器 2.removeView 在布局容器中删掉 ...

  7. Windows phone7 动态添加控件

    Windows phone7 动态添加控件 2011-03-29 3:48 using System; using System; using System.Collections.Generic; ...

  8. 学习笔记:VB.net动态添加控件数组并传递事件

    学习笔记:VB.net动态添加控件数组并传递事件 控件数组和事件 "中间人" 动态添加控件 控件数组和事件 新建一个用户窗体,在定义控件数组时,不能用Withevnets来定义数组 ...

  9. Winform Panel动态添加控件坐标原点问题

    Winform Panel动态添加控件坐标原点问题 Panel的坐标原点是在左上角,是在可视区域的左上角,当滚轮往下移动的时候,坐标原点也会跟着移动,所以动态添加控件的时候,在可视区域的时候控件的距离 ...

最新文章

  1. Docker(二):Docker 容器使用
  2. 解决“QGtkStyle could not resolve GTK……”问题
  3. Collections.unmodifiableMap
  4. 源码都没调试过,怎么能说熟悉 redis 呢?
  5. 分布式数据库的应用(一)
  6. ASP.NET MVC实用技术:开篇
  7. 今日计划:修改Plog,为期2天
  8. sonarqube没有html插件,spring-boot – 找不到id为’org.sonarqube’的插件
  9. mysql的槽_Mysql槽点 - MySQL及其它开源数据库 - ITPUB论坛-中国专业的IT技术社区...
  10. 【Linux】grep命令
  11. 一看数分就想写个程序玩玩。。。
  12. MyBatis 传入参数之parameterType
  13. android 多媒体相册,朵朵多媒体相册免费版
  14. 用HFFS实例讲解多频天线设计
  15. Go开发关键技术指南
  16. 基础篇:6.10)形位公差-包容原则与可逆原则的标注步骤全解;
  17. [系统] Linux Iptable (Log) 技巧和实例
  18. python 爬取图片、没有后缀名_python爬虫,图片是无格式的
  19. BLUES吉他学习笔记005 bluesrv[9]
  20. 道阻且长,行则将至;行而不辍,未来可期。

热门文章

  1. poj1811(pollard_rho模板)
  2. android的listview+BaseAdapter的例子
  3. logic:equal,logic:present用法
  4. 通过命令行安装或卸载Tomcat服务
  5. 一个简单HTML标签marquee实现动态滚动条
  6. qt.qpa.screen: QXcbConnection: Could not connect to display(vnpy,云主机,图形界面)
  7. NB朴素贝叶斯理论推导与三种常见模型
  8. c语言 乘号 指针 避免,C语言指针篇(一)指针与指针变量
  9. 计算机网络技术的专业认识,计算机网络技术课程学习后的自我认识
  10. php windows svn,windows下安装svnmanager