您的位置:首页 > 其它

WinForm中MenuStrip动态菜单使用总结

2012-07-20 18:02 435 查看
在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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: