轉載請聲明出處: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);
}