c#读取XML内容实现动态加载菜单

news/2024/7/10 5:50:32 标签: xml, c#, winform, string, path, menu

c#读取XML内容实现动态加载菜单

这个案例是一个基于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


http://www.niftyadmin.cn/n/791058.html

相关文章

Linux下安装boa(嵌入式web服务器…

boa是一个小型的web服务器&#xff0c;可以用于多种平台&#xff0c;在嵌入式中比较常见。 一. 编译boa程序 1. www.boa.org下载boa-0.94.13.tar.gz 2. 解压: tar –zxvf boa-0.94.13.tar.gz 3. 进入boa-0.94.13/src目录&#xff0c; 执行./configure 4. make 注意&#xff1…

注册表学习第一课

修改注册表的三种方法<在没有把握的情况下&#xff0c;一定要先备份要改的注册表哦> 1.winR 然后输入regedit.exe 打个比方&#xff0c;你若想让开始菜单消失&#xff0c;那么你首先找到HKEY_CURRENT_USER根&#xff0c; 然后Software-microsoft-windows-currentversion-…

解决C#中txt文档导入数据库时,中文显示乱码的问题

解决C#中txt文档导入数据库时&#xff0c;中文显示乱码的问题 与前篇文章不同之处用红笔标记 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.…

java画按钮的边框

import javax.swing.*;import java.awt.*;public class demo_4{ public static void main(String [] args) { demo_4_1 aanew demo_4_1(); }}class demo_4_1 extends JFrame{ JPanel pnew JPanel(); JMenuBar jmnew JMenuBar();//创建一个菜单栏 JMen…

关闭microsoft office 2013上载中心

今天发现Microsoft Office2013上载中心的运行&#xff0c;为了我的流量着想&#xff0c;所以要把它关掉。这是在安装Microsoft Office 2013的时候&#xff0c;同时安装了MicrosoftOffice2013的上载中心&#xff0c;这个上载中心其实也是一个备份文件的工具&#xff0c;怕文件…

NHibernate Simple Demo

参考&#xff1a;http://www.cnblogs.com/hbhzsysutengfei/p/6078898.html NHibernate各种数据库连接参数文件配置方法说明 &#xff1a;http://blog.csdn.net/hsg77/article/details/23463733 解决方案图&#xff1a; 上面2个引用是NHibernate必备的 先看一下调用的代码&a…

自定义用户控件编写——(文件夹目录选择)

由于最近接触项目中&#xff0c;选择目录较常用&#xff0c;先需要一个功能对其实现&#xff0c;具体如下 效果源代码如下&#xff1a; public partial class FolderButtonEdit : DevExpress.XtraEditors.ButtonEdit{public FolderButtonEdit(){InitializeComponent();this.Pro…

C#中委托和事件处理

事件是对象发送的消息&#xff0c;以发信号通知操作的发生。操作可能是由用户交互&#xff08;例如鼠标单击&#xff09;引起的&#xff0c;也可能是由某些其他的程序逻辑触发的。引发&#xff08;触发&#xff09;事件的对象叫做事件发送方。捕获事件并对其作出响应的对象叫做…