现在的位置: 首页 > 综合 > 正文

C# WFP中动态菜单的加载

2014年01月01日 ⁄ 综合 ⁄ 共 3929字 ⁄ 字号 评论关闭

        C#在普通Windows form程序中动态加载菜单的文章很多,但搜了半天发现WPF中动态菜单项目的介绍很少。是不是我 的想法很奇怪呢?呵呵,不管了,记录一下实现过程。

       

        private void MainFrm_Load(object sender, EventArgs e)
        {
            LoadAllPlugs();  //加载所有组件
            LoadAllMenus();  //加载菜单
        }

        //加载主菜单函数
        private void SetMenu(MenuStrip mMain, string mName)
        {
            try
            {
                string strSql;
                int i;
                IDBOperator db = DBOperator.GetInstance();
                strSql = "SELECT * FROM SYS_Plugsins WHERE FStatus='1' And FParentNo='" + mName + "' Order by FMenuSequence";

                DataTable dt = new DataTable();
                dt = db.ReturnDataTable(strSql);
                if (dt.Rows.Count > 0)
                {
                    for (i = 0; i < dt.Rows.Count; i++)
                    {
                        if (dt.Rows[i]["FParentNo"].ToString() == "0")
                        {
                            ToolStripMenuItem mItem;
                            mItem = new ToolStripMenuItem(dt.Rows[i]["FMenuText"].ToString());
                            mItem.Name = dt.Rows[i]["FMenuName"].ToString();
                            mItem.AccessibleDescription = dt.Rows[i]["FPlugsins"].ToString(); //借用这个属性
                            mMain.Items.Add(mItem);
                            SetSubMenu((ToolStripMenuItem)mMain.Items[dt.Rows[i]["FMenuName"].ToString()], dt.Rows[i]["FMenuName"].ToString());
                        }
                    }
                }
            }
            catch
            {
                MessageBox.Show("创建主菜单时出错", "出错", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        //加载子菜单函数
        private void SetSubMenu(ToolStripMenuItem mItem, string mName)
        {
            try
            {
                string strSql;
                int i;                //查询数据库
                strSql = "SELECT * FROM SYS_Plugsins WHERE FStatus='1' And FParentNo='" + mName + "' Order by FMenuSequence";
                IDBOperator db = DBOperator.GetInstance();
                DataTable dt = new DataTable();
                dt = db.ReturnDataTable(strSql);
                for (i = 0; i < dt.Rows.Count; i++)
                {
                    if (dt.Rows[i]["FParentNo"].ToString() == mName)
                    {
                        ToolStripMenuItem mSubItem;
                        EventHandler eh = GetEvent(dt.Rows[i]["FMenuEvent"]); //获得操作事件
                        Keys key = GetShurtcutKeys(dt.Rows[i]["FMenuShortcutKeys"]);//获得快捷键

                        //创建菜单项
                        mSubItem = new ToolStripMenuItem(dt.Rows[i]["FMenuText"].ToString(), imageList1.Images[(int)dt.Rows[i]["FMenuIcon"]], eh, key);
                        mSubItem.Name = dt.Rows[i]["FMenuName"].ToString();
                        mSubItem.AccessibleDescription = dt.Rows[i]["FPlugsins"].ToString();
                        mItem.DropDownItems.Add(mSubItem);  //设置子菜单
                        SetSubMenu((ToolStripMenuItem)mItem.DropDownItems[dt.Rows[i]["FMenuName"].ToString()], dt.Rows[i]["FMenuName"].ToString());
                    }
                }
            }
            catch
            {
                MessageBox.Show("创建子菜单时出错", "出错", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

 

这三个函数主要完成在普通Windows form程序中动态Menu的方法,先记录在这里。

在WPF中没有MenuStrip控件,只有Menu控件了,这个控件是可以无限级别展开的。所以程序应该是下面这个样子(有错误):

        //加载主菜单函数
        private void SetMenu(Menu mMain, string mName)
        {
            try
            {
                string strSql;
                int i;
                IDBOperator db = DBOperator.GetInstance();
                strSql = "SELECT * FROM SYS_Plugsins WHERE FStatus='1' And FParentNo='" + mName + "' Order by FMenuSequence";

                DataTable dt = new DataTable();
                dt = db.ReturnDataTable(strSql);
                if (dt.Rows.Count > 0)
                {
                    for (i = 0; i < dt.Rows.Count; i++)
                    {
                        if (dt.Rows[i]["FParentNo"].ToString() == "0")
                        {
                            MenuItem mItem;
                            mItem = new MenuItem(); 
                            mItem.Header = dt.Rows[i]["FMenuText"].ToString();
                            mItem.Name = dt.Rows[i]["FMenuName"].ToString();
                            //mItem.AccessibleDescription = dt.Rows[i]["FPlugsins"].ToString(); //借用这个属性
                            mMain.Items.Add(mItem);
                            SetSubMenu((MenuItem)mMain.Items[dt.Rows[i]["FMenuName"].ToString()], dt.Rows[i]["FMenuName"].ToString());
                        }
                    }
                }
            }
            catch
            {
                MessageBox.Show("创建主菜单时出错", "出错");
            }
        }

        //加载子菜单函数
        private void SetSubMenu(MenuItem mItem, string mName)
        {
            try
            {
                string strSql;
                int i;                //查询数据库
                strSql = "SELECT * FROM SYS_Plugsins WHERE FStatus='1' And FParentNo='" + mName + "' Order by FMenuSequence";
                IDBOperator db = DBOperator.GetInstance();
                DataTable dt = new DataTable();
                dt = db.ReturnDataTable(strSql);
                for (i = 0; i < dt.Rows.Count; i++)
                {
                    if (dt.Rows[i]["FParentNo"].ToString() == mName)
                    {
                        MenuItem mSubItem;
                        //EventHandler eh = GetEvent(dt.Rows[i]["FMenuEvent"]); //获得操作事件
                        //Keys key = GetShurtcutKeys(dt.Rows[i]["FMenuShortcutKeys"]);//获得快捷键

                        //创建菜单项
                        mSubItem = new MenuItem();
                        mSubItem.Header = dt.Rows[i]["FMenuText"].ToString();
                        mSubItem.Name = dt.Rows[i]["FMenuName"].ToString();
                        //mSubItem.AccessibleDescription = dt.Rows[i]["FPlugsins"].ToString();
                        mItem.Items.Add(mSubItem);  //设置子菜单
                        SetSubMenu((MenuItem)mItem.Items[dt.Rows[i]["FMenuName"].ToString()], dt.Rows[i]["FMenuName"].ToString());
                    }
                }
            }
            catch
            {
                MessageBox.Show("创建子菜单时出错", "出错");
            }
        }

问题出现在:

SetSubMenu((ToolStripMenuItem)mMain.Items[dt.Rows[i]["FMenuName"].ToString()], dt.Rows[i]["FMenuName"].ToString());

转化为

SetSubMenu((MenuItem)mMain.Items[dt.Rows[i]["FMenuName"].ToString()], dt.Rows[i]["FMenuName"].ToString());

 

等待处理中......

 

 

抱歉!评论已关闭.