C# WinForm中MenuStrip動態菜單使用總結

來源:互聯網
上載者:User

轉載請聲明出處:http://www.freemansoft.net/blog/Article/438.aspx

 

在C# WinForm中使用菜單控制項,我想MenuStrip是很多人的首選,如何使用我就不多說了,我就講講個人的使用心得。
以前在使用該控制項的時候只知道在表單設計器中手動輸入功能表項目,這樣做是比較方便,但卻不靈活。
某次要做的一個項目,涉及到許可權分配,不同許可權的人需要用到不同的菜單,這就需要在表單載入的時候動態建立MenuStrip及其功能表項目。
後來上網搜尋了很多相關建立動態菜單的代碼,但卻都不理想,最後只能自己取各家所長,自己動手修改完成了這個東西。
我的思路是這樣的:

1、首先要在資料庫裡建立一個菜單表TB_MENU,欄位主要有
--------------------------
ID-唯一標識值
FATHER_ID-功能表項目的父ID,如果是頂級菜單則為0
MENU_NAME-該功能表項目在表單中的控制項名稱
MENU_TEXT-該功能表項目顯示名稱
MODULE_ACTION-該功能表項目要招待的事件名稱,帶括弧,例如:btnCreateUser_click()
--------------------------
這些欄位是必需的,其他的就要根據你的實際情況而定了。

2、在表單中拖放一個MenuStrip控制項,名稱為MainMenu1

3、在表單代碼的FORM_LOAD中加入以下語句:CreateMenu();
當然如果情況特殊,也可以在別的地方加入該句代碼,視實際情況自己決定。

4、在相關表單代碼中加入以下建構函式

    public void CreateMenu()
        {
          
            //取所有功能表項目的語句,如果有許可權限制等情況自行修改
            String menuSql="select * from TB_MENU";
            //取得功能表項目資料集
            DataSet ds = DbClass.getDataSet(menuSql);
            //檢查判斷DataSet資料是否完整
            if (CheckData(ds))
            {
                //載入MenuStrip菜單
                ToolStripMenuItem topMenu = new ToolStripMenuItem();
                LoadSubMenu(ref topMenu, "0");
            }
         
        }

        /// <summary>
        /// 遞迴建立MenuStrip菜單(模組列表)
        /// </summary>
        /// <param name="topMenu">父功能表項目</param>
        /// <param name="FATHER_ID">父菜單的ID</param>
        private void LoadSubMenu(ref ToolStripMenuItem topMenu, String inFatherId)
        {
            DataView dvList = new DataView(menuTable);
            //過濾出當前父菜單下在所有子功能表資料(僅為下一層的)
            dvList.RowFilter = "FATHER_ID='" + inFatherId + "'";
            ToolStripMenuItem subMenu;
            foreach (DataRowView dv in dvList)
            {
                //建立子功能表項
                subMenu = new ToolStripMenuItem();
                subMenu.Name = dv["MENU_NAME"].ToString();
                subMenu.Text = dv["MENU_TEXT"].ToString();

                //判斷是否為頂級菜單
                if (inFatherId == "0")
                {
                    MainMenu1.Items.Add(subMenu);
                }
                else
                {
                    subMenu.Tag = dv["MODULE_ACTION"].ToString();
                    String str = " void " + dv["MODULE_ACTION"].ToString();
                    //給功能表項目加事件。
                    subMenu.Click += new EventHandler(subMenu_Click);

                    topMenu.DropDownItems.Add(subMenu);
                }

                //遞迴調用
                LoadSubMenu(ref subMenu, dv["ID"].ToString());

            }

        }

        /**/
        /// <summary>
        /// 菜單單擊事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void subMenu_Click(object sender, EventArgs e)
        {

            try
            {
                //tag屬性在這裡有用到。
                string acName = ((ToolStripMenuItem)sender).Tag.ToString();

                if (acName != "")
                {
                    string[] strArray = acName.Split(new char[] { ',' });
                    if (strArray.Length > 2)
                    {
                    }
                    else
                    {
                        String str = "void " + acName;
                        foreach (MethodInfo info in base.GetType().GetMethods())
                        {
                            if (str.Trim().ToLower().CompareTo(info.ToString().Trim().ToLower()) == 0)
                            {
                                info.Invoke(this, null);
                            }
                        }
                    }
                }
            }
            catch (Exception exception)
            {

            }
        }

        //檢查判斷DataSet資料是否完整
        public static bool CheckData(DataSet inData)
        {
            bool flag = false;
            if (CheckTable(inData))
            {
                for (int i = 0; i < inData.Tables.Count; i++)
                {
                    if (inData.Tables.Rows.Count > 0)
                    {
                        flag = true;
                    }
                }
                return flag;
            }
            return false;
        }
       public static bool CheckTable(DataSet inData)
        {
            if (inData == null)
            {
                return false;
            }
            return (inData.Tables.Count > 0);
        }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.