1.使用一个XML文件配置功能菜单
2.在一个WINFORM上有一个下拉框,下拉框中显示所有配置的菜单
3.选择一个菜单能进入相应的窗口我知道这对于大虾们来说,是很简单的! 但小弟不会! 往大虾们指点一下!谢谢!!!

解决方案 »

  1.   


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    using System.Xml;
    using OutLookBar;
    using VivantLabs;
    namespace Menu
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        private void Form1_Load(object sender, EventArgs e)
            {
                this.CreateMenu();//加载置顶菜单信息
                this.outLookBarInit();//加载左菜单信息
            }        #region 创建置顶菜单项
            /// <summary>
            /// 动态创建菜单
            /// </summary>
            /// <param name="FilePath">菜单XML文件的路径</param>
            public void CreateMenu()
            { 
                //定义一个主菜单
                MenuStrip mainMenu = new MenuStrip(); 
                //设置主菜单的位置
                mainMenu.Parent = this.panel1;
                mainMenu.Dock = DockStyle.Fill;
                //定义一个Dataset保存读取的Xml文件
                DataSet ds = new DataSet();
                //读取Xml数据
                if (!File.Exists(Application.StartupPath + @"\Menu.xml"))
                {
                    MessageBox.Show("配置文件不存在!","系统提示");
                    return;
                }
                ds.ReadXml(Application.StartupPath + @"\Menu.xml");
                //赋值给DataView
                DataView dv = ds.Tables[0].DefaultView;            this.dataGridView1.DataSource = dv;//测试            //通过DataView来过滤数据并最先得到最顶层的菜单项
                dv.RowFilter = "ParentItemID=0";
                for (int i = 0; i < dv.Count; i++)
                {
                    //创建一个菜单项
                    ToolStripMenuItem topMenu = new ToolStripMenuItem();
                    //给菜单赋Text值。也就是在界面上看到的值。
                    topMenu.Text = dv[i]["Text"].ToString();
                    // 添加退出事件
                    if ("退出".Equals(dv[i]["Text"].ToString()))
                    {
                        topMenu.Click += new EventHandler(topMenu_Click);
                    }
                    //如果是有下级菜单则通过CreateSubMenu方法来创建下级菜单
                    if (Convert.ToInt16(dv[i]["IsModule"]) == 1)
                    {
                        //以ref的方式将顶层菜单传递参数,因为他可以在赋值后再回传。--也许还有更好的方法^_^.
                        CreateSubMenu(ref topMenu, Convert.ToInt32(dv[i]["ItemID"]), ds.Tables[0]);
                    }
                    //显示应用程序中已打开的 MDI 子窗体列表的菜单项
                    mainMenu.MdiWindowListItem = topMenu;
                    //将递归附加好的菜单加到菜单根项上。
                    mainMenu.Items.Add(topMenu);
                }
                mainMenu.Dock = DockStyle.Top;
                //将窗体的MainMenuStrip梆定为mainMenu.
                this.MainMenuStrip = mainMenu;
                //这句很重要。如果不写这句菜单将不会出现在主窗体中。
                this.Controls.Add(mainMenu);
            }        /// <summary>
            /// 创建子菜单
            /// </summary>
            /// <param name="topMenu">父菜单项</param>
            /// <param name="ItemID">父菜单的ID</param>
            /// <param name="dt">所有菜单数据集</param>
            private void CreateSubMenu(ref ToolStripMenuItem topMenu, int ItemID, DataTable dt)
            {
                DataView dv = new DataView(dt);
                //过滤出当前父菜单下在所有子菜单数据(仅为下一层的)
                dv.RowFilter = "ParentItemID=" + ItemID.ToString();
                for (int i = 0; i < dv.Count; i++)
                {
                    //创建子菜单项
                    ToolStripMenuItem subMenu = new ToolStripMenuItem();
                    subMenu.Text = dv[i]["Text"].ToString();
                    //如果还有子菜单则继续递归加载。
                    if (Convert.ToInt16(dv[i]["IsModule"]) == 1)
                    {
                        //递归调用
                        CreateSubMenu(ref subMenu, Convert.ToInt32(dv[i]["ItemID"]), dt);
                    }
                    else
                    {
                        //扩展属性可以加任何想要的值。这里用formName属性来加载窗体。
                        //给没有子菜单的菜单项加事件。
                        if ("记事本".Equals(dv[i]["Text"].ToString()))
                        {
                            subMenu.Tag = "Notepad";
                            subMenu.Click += new EventHandler(OtherTools_Click);
                        }
                        else if ("画图".Equals(dv[i]["Text"].ToString()))
                        {
                            subMenu.Tag = "MsPaint";
                            subMenu.Click += new EventHandler(OtherTools_Click);
                        }
                        else if ("操作助手".Equals(dv[i]["Text"].ToString()))
                        {
                            subMenu.Tag = "Assistant";
                            subMenu.Click += new EventHandler(OtherTools_Click);
                        }
                        else if ("计算器".Equals(dv[i]["Text"].ToString()))
                        {
                            subMenu.Tag = "Calc";
                            subMenu.Click += new EventHandler(OtherTools_Click);
                        }
                        else
                        {
                            subMenu.Tag = dv[i]["FormName"].ToString();
                            subMenu.Click += new EventHandler(subMenu_Click);
                        }
                    }
                    if (dv[i]["ImageName"].ToString().Length > 0)
                    {
                        //设置菜单项前面的图票为16X16的图片文件。
                        Image img = Image.FromFile(@"..\..\Image\" + dv[i]["ImageName"].ToString());
                        subMenu.Image = img;
                        subMenu.Image.Tag = dv[i]["ImageName"].ToString();
                    }
                    //将菜单加到顶层菜单下。
                    topMenu.DropDownItems.Add(subMenu);
                }
            }
      

  2.   


    /// <summary>
            /// 菜单单击事件
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            void subMenu_Click(object sender, EventArgs e)
            {
                //tag属性在这里有用到。
                string formName = ((ToolStripMenuItem)sender).Tag.ToString();
                CreateFormInstance(formName);        }        //其它工具菜单事件的注册方法
            private void OtherTools_Click(object sender, EventArgs e)
            {
                switch (((ToolStripMenuItem)(sender)).Tag.ToString())
                {
                    case "Calc":   //计算器
                        {
                            System.Diagnostics.Process.Start("Calc.exe");
                            break;
                        }
                    case "Notepad": //记事本
                        {
                            System.Diagnostics.Process.Start("Notepad.exe");
                            break;
                        }
                    case "MsPaint": //画图
                        {
                            System.Diagnostics.Process.Start("MsPaint.exe");
                            break;
                        }
                    case "Assistant":
                        {
                            MessageBox.Show("帮助文件正在制作中,感谢您的使用!!!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            break;
                        }
                }
            }        /// <summary>
            /// 退出菜单单击事件
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            void topMenu_Click(object sender, EventArgs e)
            {
                if (MessageBox.Show("您确实要退出系统吗?", "系统提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
                {
                    this.Dispose();
                    Application.Exit();
                    GC.Collect();
                }
            }        /// <summary>
            /// 创建form实例。
            /// </summary>
            /// <param name="formName">form的类名</param>
            private void CreateFormInstance(string formName)
            {            bool flag = false;
                //遍历主窗口上的所有子菜单
                for (int i = 0; i < this.MdiChildren.Length; i++)
                {
                    //如果所点的窗口被打开则重新激活
                    if (this.MdiChildren[i].Tag.ToString().ToLower() == formName.ToLower())
                    {
                        this.MdiChildren[i].Activate();
                        this.MdiChildren[i].Show();
                        this.MdiChildren[i].WindowState = FormWindowState.Normal;
                        flag = true;
                        break;
                    }
                }
                if (!flag)
                {
                    this.pnlMain.Controls.Clear();
                    string formstring = @"Menu" + @"." + formName;//系统中窗体的名称
                    Type t = Type.GetType(formstring);
                    object obj = System.Activator.CreateInstance(t);
                    Form f = (Form)obj;
                    f.TopLevel = false;
                    f.Parent = this.pnlMain;
                    f.Dock = DockStyle.Fill;
                    f.Show();
                }
            }        #endregion
            #region 初始化LookOutBar
            /// <summary>
            /// 初始化LookOutBar
            /// </summary>
            private void outLookBarInit()
            {
                XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.Load(Application.StartupPath + "\\MTMenu.xml");
                XmlNode root = xmlDoc.SelectSingleNode("Menus");
                XmlNodeList divlist = root.ChildNodes;
                int divcount = divlist.Count;
                for (int i = 0; i < divcount; i++)
                {
                    OutLookWrapper m_OLW = new OutLookWrapper();
                    m_OLW.Text = divlist[i].Attributes["Name"].Value.ToString();
                    XmlNodeList buttonlist = divlist[i].ChildNodes;
                    int buttoncount = buttonlist.Count;
                    for (int j = 0; j < buttoncount; j++)
                    {
                        OutLookRow m_OLR = new OutLookRow();
                        m_OLR.Icon = new Icon(buttonlist[j].ChildNodes.Item(2).InnerText);
                        m_OLR.Text = buttonlist[j].ChildNodes.Item(0).InnerText;
                        string formname = buttonlist[j].ChildNodes.Item(1).InnerText;
                        m_OLR.FormName = formname;
                        ButtonClicked a = new ButtonClicked(clickedOpenForm);
                        m_OLR.SetAction(a);
                        m_OLW.AddRow(m_OLR);
                    }
                    m_OLW.Mode = ViewMode.Large_Icons;
                    this.outLookBar1.AddRow(m_OLW);
                }
            }
            #endregion        #region 左菜单
            /// <summary>
            ///左菜单
            /// </summary>
            /// <param name="formname"></param>
            private void clickedOpenForm(string formname)
            {
                
            }
            #endregion    }
    }
      

  3.   

    menu.xml<?xml version="1.0" encoding="utf-8" ?>
    <Menus>
        <MenuItem>
        <Text>VIP储值卡管理</Text>
        <ItemID>101</ItemID>
        <ParentItemID>0</ParentItemID>
        <FormName></FormName>
        <IsModule>1</IsModule>
        <Level>0</Level>
        <ImageName></ImageName>
      </MenuItem>
      <MenuItem>
        <Text>VIP储值卡写卡</Text>
        <ItemID>101001</ItemID>
        <ParentItemID>101</ParentItemID>
        <FormName>CardRF001</FormName>
        <IsModule>0</IsModule>
        <Level>0</Level>
        <ImageName></ImageName>
      </MenuItem>
      <MenuItem>
        <Text>VIP储值卡换卡</Text>
        <ItemID>101002</ItemID>
        <ParentItemID>101</ParentItemID>
        <FormName>CardRF002</FormName>
        <IsModule>0</IsModule>
        <Level>0</Level>
        <ImageName></ImageName>
      </MenuItem>
      <MenuItem>
        <Text>VIP储值卡挂失</Text>
        <ItemID>101003</ItemID>
        <ParentItemID>101</ParentItemID>
        <FormName>CardRF003</FormName>
        <IsModule>0</IsModule>
        <Level>0</Level>
        <ImageName></ImageName>
      </MenuItem>
      <MenuItem>
        <Text>VIP储值卡注销</Text>
        <ItemID>101004</ItemID>
        <ParentItemID>101</ParentItemID>
        <FormName>CardRF004</FormName>
        <IsModule>0</IsModule>
        <Level>0</Level>
        <ImageName></ImageName>
      </MenuItem>
      <MenuItem>
        <Text>挂帐管理</Text>
        <ItemID>108</ItemID>
        <ParentItemID>0</ParentItemID>
        <FormName></FormName>
        <IsModule>1</IsModule>
        <Level>0</Level>
        <ImageName></ImageName>
      </MenuItem>
    ...
    ...
      

  4.   

    outlookbar这个dll你可以到网上搜下,然后引用它,或者不用它,测试下功能,是可用的
      

  5.   

    string formstring = @"Menu" + @"." + formName;//系统中窗体的名称
    Type t = Type.GetType(formstring);
    object obj = System.Activator.CreateInstance(t);
    上面一段怎么解释呀!? 我的在这里运行不成功! 其中的t是NULL.
    当然,我也不是使用MenuStrip 的方式.我只是将菜单加载到一个COMBOBOX中,COMBOBOX的DISPLAYMEMBER是TEXT,COMBOBOX的VALUEMEMBER是FORMNAME. 结果我在SELECTEDINDEXCHANGE事件中,将取到的COMBOBOX.SELECTEDVALUE放到上面代码的formName中就不行! 我也试着将@"Menu" + @"."  去掉. 还是不行!所以我就不明白,这里为什么要加个"MENU."谢谢!!!
      

  6.   

    http://hi.baidu.com/jackeyrain/blog/item/3cb44c180ecf8bbc4bedbc08.html
      

  7.   

    我顶我顶,我顶顶顶! 不要沉了呀! 在线WAITING...
      

  8.   

    string formstring = "窗体的名称";
      

  9.   

    我搞出来了! 哈...
    不用什么动态添加引用! LOOK下面的代码:Assembly assembly = Assembly.LoadFile(Application.StartupPath + @"\AnotherProject.dll");            object temp = assembly.CreateInstance("AnotherProject.Form1");            Type curType = assembly.GetType("AnotherProject.Form1", false, true);            object obj = System.Activator.CreateInstance(curType);
                Form f = (Form)obj;
                f.TopLevel = true;
                f.ShowDialog();
      

  10.   

    顺便说一下,如果是同命名空间下的窗体直接调用下面的方法就可以:string formstring1 = @"当前命名空间的名字" + @"." + formName;//系统中窗体的名称
                Type t = Type.GetType(formstring);
                object obj = System.Activator.CreateInstance(t);
                Form f = (Form)obj;
                f.TopLevel = true;
                f.ShowDialog();