WinForm中MenuStrip动态菜单使用总结
来源:互联网 发布:搞笑网络剧排行榜 编辑:程序博客网 时间:2024/05/24 06:50
在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);
}
- WinForm中MenuStrip动态菜单使用总结
- C# WinForm中MenuStrip动态菜单使用总结
- C# WinForm中MenuStrip动态菜单使用总结
- C# WinForm中MenuStrip动态菜单使用总结
- WinForm中MenuStrip控件
- WinForm中MenuStrip控件
- C# 使用数据库和MenuStrip动态生成菜单
- 在Winform中菜单动态添加“最近使用文件”
- 【转载】Winform 菜单MenuStrip控件用法的一些自我介绍
- C# TreeView菜单,MenuStrip菜单递归动态生成例子
- C#树状视图动态加载Menustrip导航菜单
- winform menustrip的遍历
- winform menustrip的遍历
- winform menustrip的遍历
- C#Winform菜单的使用问题总结
- WinForm winform动态生成菜单
- WinForm动态菜单原创
- WinForm动态生成菜单
- grails 代码中运行环境检测
- C|C++中的静态全局变量,静态局部变量,全局变量,局部变量的区别
- Saving Princess claire_&&http://acm.hdu.edu.cn/showproblem.php?pid=4308
- UITextView控件的用法详解
- Android的一些属性----待续
- WinForm中MenuStrip动态菜单使用总结
- C Programming Language 1-14
- java编程将HTML文件转换成PDF文件
- HDU-1258(DFS搜索的问题)
- DataGridView取消默认选中行
- 编程珠玑第二章
- C# DataColumn
- D3D9 vs D3D1x
- 深入浅出FPGA-1-Cyclone芯片内部