我现在在做的一个用户管理模块,布局是左边显示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望各位高手帮我看看如何实现顶部菜单点击选中项打开窗体?

解决方案 »

  1.   

    每个菜单项都是一个ToolStripItem,处理ToolStripItem的Click事件。
      

  2.   


    我这个顶部的菜单是动态从数据库生成的,不同的用户有不同的权限,我怎么才能和ToolStripItem的Click事件关联?我里面写的如下事件不行,调试有问题,我不知道该怎么写?望高手指点下,谢谢!//给没有子菜单的菜单项加事件
      subMenu.Click += new EventHandler(subMenu_Click);
      

  3.   

    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();
      }
      }我的问题是代码调试到object frmObj = asm.CreateInstance("FarmSystem." + formName);
      // object frmObj = asm.CreateInstance(formName);
      //MessageBox.Show(frmObj.ToString());
      Form frms = (Form)frmObj;
    这里,实例对象frms的值老是为null,程序就报异常了,我没搞清楚是什么原因?望高手指点,谢谢~
      

  4.   

    如何选中顶部菜单栏的子菜单打开相应的子窗体?>>
    在菜单表中定义字段: FormFullName , 如  abc.frmAbout, 加载菜单时取出来,可以放在tag内
    在click事件内反射技术动态创建窗体.