winform 如何激活ToolStripMenuItem选中项窗体,并打开?
我现在在做的一个用户管理模块,布局是左边显示treeview菜单,顶部显示菜单栏,treeview和顶部菜单栏都是从数据库根据不同用户加载不同的操作模块。现在是顶部菜单栏加载数据已经显示出来了,我的问题是:如何选中顶部菜单栏的子菜单打开相应的子窗体?
我用的是c#语言winform,加载数据库顶部菜单代码如下:
private void Main_Load(object sender, EventArgs e)
{
//展开树节点状态
this.trevMenu.ExpandAll();
//加载树结构
//CreateTree();
//加载菜单
CreateMenu();
}
#region 动态创建菜单
/// <summary>
/// 动态创建菜单
/// </summary>
public void CreateMenu()
{
//定义一个主菜单
MenuStrip mainMenu = new MenuStrip();
XD.BLL.OperateCode oprCode = new XD.BLL.OperateCode();
DataSet ds = oprCode.getOperateMenu();
DataView dv = ds.Tables[0].DefaultView;
//通过DataView来过滤首先得到最顶层的菜单
dv.RowFilter = "CHILDTRSANCD is null";
for (int i = 0; i < dv.Count; i++)
{
//创建一个菜单项
ToolStripMenuItem topMenu = new ToolStripMenuItem();
//给菜单Text赋值,即界面看到的值
topMenu.Text = dv[i]["TRANSNAME"].ToString();
topMenu.Name = dv[i]["TRANSCD"].ToString();
//如果有下级菜单则通过CreateSubMenu方法来创建
if (dv[i]["CHILDTRSANCD"].ToString() != "NULL" || dv[i]["CHILDTRSANCD"].ToString() != "null")
{
//创建子菜单,以ref的方式将顶层菜单传递参数,因为他可以在赋值后回传
//CreateSubMenu(ref topMenu, Convert.ToInt16(dv[i]["TRANSCD"]), ds.Tables[0]);
CreateSubMenu(ref topMenu, dv[i]["TRANSCD"].ToString(), ds.Tables[0]);
}
//显示应用程序中已打开的MDI子窗体列表的菜单项
mainMenu.MdiWindowListItem=topMenu;
//将递归附加好的菜单加到菜单根项上
mainMenu.Items.Add(topMenu);
}
ToolStripMenuItem exitMenu = new ToolStripMenuItem();
//mainMenu.Dock = DockStyle.Top;
//将窗体的menStrMainMenu绑定到mainMenu
this.tsmiMenuItem = mainMenu;
//这句很重要,如果不写这句菜单将不会出现在主窗体中
this.Controls.Add(mainMenu);
}
#endregion
#region 递归加载子菜单
/// <summary>
/// 递归加载子菜单
/// </summary>
/// <param name="topMenu">父菜单项</param>
/// <param name="itemID">父菜单ID</param>
/// <param name="dt">所有菜单项数据集</param>
public void CreateSubMenu(ref ToolStripMenuItem topMenu, string itemID, DataTable dt)
{
DataView dv = new DataView(dt);
//过滤出当前父菜单下在子菜单数据(仅为下一层)
dv.RowFilter = "CHILDTRSANCD=" + itemID.ToString();
for (int i = 0; i < dv.Count; i++)
{
//创建子菜单项
ToolStripMenuItem subMenu = new ToolStripMenuItem();
subMenu.Text = dv[i]["TRANSNAME"].ToString();
subMenu.Name = dv[i]["TRANSCD"].ToString();
//如果有子菜单项则继续递归加载...
if (dv[i]["CHILDTRSANCD"].ToString() == "NULL" || dv[i]["CHILDTRSANCD"].ToString() == "")
{
//递归调用
//CreateSubMenu(ref subMenu, Convert.ToInt16(dv[i]["TRANSCD"]), dt);
CreateSubMenu(ref subMenu, dv[i]["TRANSCD"].ToString(), dt);
}
else
{
//扩展属性可以加任何想要的值,这里用formName
//subMenu.Tag = dv[i]["FormName"].ToString();
subMenu.Tag = dv[i]["TRANSCD"].ToString();
//给没有子菜单的菜单项加事件
subMenu.Click += new EventHandler(subMenu_Click);
}
//将菜单加到顶层菜单数下
topMenu.DropDownItems.Add(subMenu);
}
}
#endregion
public void subMenu_Click(object sender, EventArgs e)
{
string formName = ((ToolStripMenuItem)sender).Tag.ToString();
// CreateFormInstance(formName);
CreateFormInstance(formName, ((ToolStripMenuItem)sender).Name.ToString());
}
private void CreateFormInstance(string formName)
{
bool flag = false;
MessageBox.Show(this.MdiChildren.Length.ToString());
for (int i = 0; i < this.MdiChildren.Length; i++)
{
if (this.MdiChildren[i].Tag.ToString().ToLower() == formName.ToLower())
{
this.MdiChildren[i].Activate();
this.MdiChildren[i].Show();
this.MdiChildren[i].WindowState = FormWindowState.Maximized;
flag = true;
break;
}
}
if (!flag)
{
Assembly asm = Assembly.Load(Assembly.GetEntryAssembly().GetName().Name);
object frmObj = asm.CreateInstance("FarmSystem." + formName);
// object frmObj = asm.CreateInstance(formName);
//MessageBox.Show(frmObj.ToString());
Form frms = (Form)frmObj;
frms.Tag = formName;
frms.ShowDialog();
}
}
private void CreateFormInstance(string formName, string id)
{
bool flag = false;
for (int i = 0; i < this.MdiChildren.Length; i++)
{
if (this.MdiChildren[i].Tag.ToString().ToLower() == formName.ToLower())
{
this.MdiChildren[i].Activate();
this.MdiChildren[i].Show();
this.MdiChildren[i].WindowState = FormWindowState.Normal;
flag = true;
break;
}
}
if (!flag)
{
//Assembly asm = Assembly.Load("FarmSystem");
Assembly asm = Assembly.Load(Assembly.GetEntryAssembly().GetName().Name);
//object frmObj = null;
object frmObj = asm.CreateInstance(formName);
switch (id)
{
case "0001":
Form frms = (Form)frmObj;
//frmObj=Activator.CreateInstance(typeof.GetType(
// frms.Tag = formName;
frms.ShowDialog();
break;
}
//Assembly asm = Assembly.Load(Assembly.GetEntryAssembly().GetName().Name);
//object frmObj = asm.CreateInstance("FarmSystem." + formName);
//// object frmObj = asm.CreateInstance(formName);
////MessageBox.Show(frmObj.ToString());
//Form frms = (Form)frmObj;
//frms.Tag = formName;
//frms.ShowDialog();
}
}
数据库表结构如下:
OPRCODE
(
OPRCODE NVARCHAR(4) NOT NULL, --操作编号
OPRNAME NVARCHAR(100) NOT NULL, --操作名称
PAROPRCODE NVARCHAR(4) --父操作编号
)
数据如:
0000 用户管理 NULL
0001 修改密码 0000
0002 重置密码 0000
0003 操作员管理 0000
0004 角色管理 0000
0005 帮助 NULL
0006 关于我们 0005
望各位高手帮我看看如何实现顶部菜单点击选中项打开窗体?