程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> 從XML中動態加載菜單的示例

從XML中動態加載菜單的示例

編輯:關於C#

本文配套源碼

這個案例是一個基於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

程序運行後界面如下:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved