C#动态创建菜单
一、加入所需数据
1、创建数据表:
create table t_SysMenu(
FMenuName varchar(50) not null ,
FMenuText varchar(50) not null ,
FMenuEvent varchar(100) ,
FMenuShortcutKeys varchar(50) null,
FMenuIcon int default 0,
FMenuSequence int default 0,
FParentNo varchar(21) not null ,
FStatus char(1) default '1',---
FFlag char(1) default '1',---
FCreateDate datetime default getdate() ,
FCreator varchar(20) null ,
FModifyDate datetime default getdate() ,
FModifier varchar(20) null ,
FMemo text null ,
constraint PK_t_SysMenu primary key(FMenuName)
)
go
2、插入数据:
MenuItemBase 基础资料(&B) NULL NULL 0
MenuItemBase_01 系统代码 MenuItemBase_01_Click NULL MenuItemBase
MenuItemHelp 帮助(&H) NULL NULL 0
MenuItemHelp_About 关于(&A) MenuItemHelp_About_Click NULL MenuItemHelp
MenuItemHelp_Cat 目录(&C) NULL F1 MenuItemHelp
二、新建项目-> Windows 用应用程序
1、界面如图aa:
拖入一菜单项MenuStrip并命名为sysMenu
2、代码段:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DBClassLib;
namespace SystemMenu
{
public partial class Form1 : Form
{
private string strConnect = "user id=sa;password=; initial catalog=ERP;Server=huite-pc; Connect Timeout=30";
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
try
{
sysMenu.Items.Clear();
SetMenu(sysMenu, "0");
}
catch
{
MessageBox.Show("创建菜单时出错", "出错", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/// <summary>
///
/// </summary>
/// <param name="mMain">主菜单项</param>
/// <param name="mName">主菜单项名称</param>
private void SetMenu(MenuStrip mMain,string mName)
{
try
{
string strSql;
int i;
strSql = "SELECT * FROM t_SysMenu WHERE FStatus='1' And FParentNo='" + mName + "' Order by FMenuSequence";
DBOperator db = DBOperator.GetDBOperator(strConnect);
DataTable dt = new DataTable();
db.Open();
dt = db.GetDataTable(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.Text = dt.Rows[i]["FMenuText"].ToString();
mMain.Items.Add(mItem);
SetSubMenu((ToolStripMenuItem)mMain.Items[dt.Rows[i]["FMenuName"].ToString()], dt.Rows[i]["FMenuName"].ToString());
}
}
}
db.Close();
}
catch
{
MessageBox.Show("创建主菜单时出错", "出错", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/// <summary>
/// 创建子菜单
/// </summary>
/// <param name="mItem">要创建的子菜单的父项</param>
/// <param name="mName">要创建的子菜单的父项名称</param>
///
private void SetSubMenu( ToolStripMenuItem mItem,string mName)
{
try
{
string strSql;
int i;
//查询数据库
strSql = "SELECT * FROM t_SysMenu WHERE FStatus='1' And FParentNo='" + mName + "' Order by FMenuSequence";
DBOperator db = DBOperator.GetDBOperator(strConnect);
DataTable dt = new DataTable();
db.Open();
dt = db.GetDataTable(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.Text = dt.Rows[i]["FMenuText"].ToString();
mItem.DropDownItems.Add(mSubItem);
//设置子菜单
SetSubMenu((ToolStripMenuItem)mItem.DropDownItems[dt.Rows[i]["FMenuName"].ToString()], dt.Rows[i]["FMenuName"].ToString());
}
}
db.Close();
}
catch
{
MessageBox.Show("创建子菜单时出错", "出错", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
/// <summary>
/// 取菜单事件
/// </summary>
/// <param name="mEvent">传入菜单事件对象</param>
/// <returns>EventHandler事件句柄</returns>
protected EventHandler GetEvent(object mEvent)
{
EventHandler eh;
switch (mEvent.ToString())
{
case "MenuItemFile_Exit_Click"://退出程序
eh = new EventHandler(MenuItemFile_Exit_Click);
break;
case "MenuItemFile_Print_Click"://窗口打印
eh = new EventHandler(MenuItemFile_Print_Click);
break;
case "MenuItemWindow_Vertical_Click"://垂直排列窗口
eh = new EventHandler(MenuItemWindow_Vertical_Click);
break;
case "MenuItemWindow_CloseAll_Click"://关闭所有子窗口
eh = new EventHandler(MenuItemWindow_CloseAll_Click);
break;
case "MenuItemWindow_Cascade_Click"://重叠排列窗口
eh = new EventHandler(MenuItemWindow_Cascade_Click);
break;
case "MenuItemWindow_Horizontal_Click"://窗口水平排列
eh = new EventHandler(MenuItemWindow_Horizontal_Click);
break;
case "MenuItemHelp_About_Click"://关于窗口
eh = new EventHandler(MenuItemHelp_About_Click);
break;
case "MenuItemBase_01_Click"://系统基本代码维护
eh = new EventHandler(MenuItemBase_01_Click);
break;
default:
eh = new EventHandler(MenuItemNull_Click);
break;
}
return eh;
}
/// <summary>
/// 获取操作快捷键
/// </summary>
/// <param name="mShurtcut"></param>
/// <returns></returns>
protected Keys GetShurtcutKeys(object mShurtcut)
{
Keys key;
switch (mShurtcut.ToString())
{
case "CtrlA":
key = (Keys)Shortcut.CtrlA;
break;
case "F1":
key = (Keys)Shortcut.F1;
break;
default:
key = (Keys)Shortcut.None;
break;
}
return key;
}
/// <summary>
/// 空事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void MenuItemNull_Click(object sender, EventArgs e)
{
}
/// <summary>
/// 退出程序
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MenuItemFile_Exit_Click(object sender, EventArgs e)
{
Application.Exit();
}
/// <summary>
/// 窗口打印
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MenuItemFile_Print_Click(object sender, EventArgs e)
{
MessageBox.Show("菜单事件", "响应", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
/// <summary>
/// 垂直排列窗口
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MenuItemWindow_Vertical_Click(object sender, EventArgs e)
{
LayoutMdi(MdiLayout.TileVertical);
}
/// <summary>
/// 关闭所有子窗口
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MenuItemWindow_CloseAll_Click(object sender, EventArgs e)
{
foreach (Form childForm in MdiChildren)
{
childForm.Close();
}
}
/// <summary>
/// 重叠排列窗口
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MenuItemWindow_Cascade_Click(object sender, EventArgs e)
{
LayoutMdi(MdiLayout.Cascade);
}
/// <summary>
/// 窗口水平排列
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MenuItemWindow_Horizontal_Click(object sender, EventArgs e)
{
LayoutMdi(MdiLayout.TileHorizontal);
}
/// <summary>
/// 关于窗口
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MenuItemHelp_About_Click(object sender, EventArgs e)
{
}
/// <summary>
/// 系统基本代码维护
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MenuItemBase_01_Click(object sender, EventArgs e)
{
//不重复打开窗口
if (CheckChildForm("FormBaseCode") == false)
{
//打开窗口
}
else
{
//激活窗口
}
}
/// <summary>
/// 检测子窗口是否已打开
/// </summary>
/// <param name="childForm">子窗口名称</param>
/// <returns>bool</returns>
private bool CheckChildForm(string strChildForm)
{
bool isOpen = false;
foreach (Form childForm in MdiChildren)
{
if (childForm.Name == strChildForm)
{
isOpen = true;
break;
}
}
return isOpen;
}
}