using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; //连接数据查询 using JuLong.CFMS.BankOutlet.DAL; //反射用 using System.Reflection; namespace JuLong.CFMS.BankOutlet.WinForms { public partial class testMenu : Form { #region 私有变量 XT_权限管理 f_XT_权限管理; #endregion public testMenu() { f_XT_权限管理 = new XT_权限管理(); InitializeComponent(); } private void testMenu_Load(object sender, EventArgs e) { DataTable m_dt = f_XT_权限管理.SelectXT_QuanXiansDynamic("TI_XiangLeiX<2 and TI_JiLuZT=1", "I_QXid", null); DataView dv = new DataView(m_dt); //查询是否还有后继项用 DataView dv1 = new DataView(m_dt); //通过DataView来过滤数据首先得到最顶层的菜单 dv.RowFilter = "I_ShangJiid=0"; for (int i = 0; i < dv.Count; i++) { //创建一个菜单项 ToolStripMenuItem topMenu = new ToolStripMenuItem(); //给菜单赋Text值。也就是在界面上看到的值。 topMenu.Text = dv[i]["S_QuanXianXM"].ToString(); dv1.RowFilter = "I_ShangJiid=" + dv[i]["I_QXid"].ToString(); //如果是有下级菜单则通过CreateSubMenu方法来创建下级菜单 if (dv1.Count>0) { //以ref的方式将顶层菜单传递参数,因为他可以在赋值后再回传。 CreateSubMenu(ref topMenu, Convert.ToInt32(dv[i]["I_QXid"]), m_dt); } //显示应用程序中已打开的 MDI 子窗体列表的菜单项 this.menuStrip1.MdiWindowListItem = topMenu; //将递归附加好的菜单加到菜单根项上。 this.menuStrip1.Items.Add(topMenu); } this.menuStrip1.Dock = DockStyle.Top; } /// <summary> /// 加载子菜单方法 /// </summary> /// <param name="topMenu">父菜单项</param> /// <param name="ItemID">父菜单编号</param> /// <param name="dt">数据源</param> private void CreateSubMenu(ref ToolStripMenuItem topMenu, int ItemID, DataTable dt) { DataView dv = new DataView(dt); //查询是否还有后继项用 DataView dv1 = new DataView(dt); //过滤出当前父菜单下在所有子菜单数据(仅为下一层的) dv.RowFilter = "I_ShangJiid=" + ItemID.ToString(); for (int i = 0; i < dv.Count; i++) { //创建子菜单项 ToolStripMenuItem subMenu = new ToolStripMenuItem(); subMenu.Text = dv[i]["S_QuanXianXM"].ToString(); dv1.RowFilter = "I_ShangJiid=" + dv[i]["I_QXid"].ToString(); //如果还有子菜单则继续递归加载。 if (dv1.Count > 0) { //递归调用 CreateSubMenu(ref subMenu, Convert.ToInt32(dv[i]["I_QXid"]), dt); } else { //扩展属性可以加任何想要的值。这里用formName属性来加载窗体。 subMenu.Tag = "frm"+dv[i]["S_QuanXianXM"].ToString(); //给没有子菜单的菜单项加事件。 subMenu.Click += new EventHandler(subMenu_Click); } //有图片就加,没有不加 //if (dv[i]["I_TuBiaoSYH"].ToString().Length > 0) //{ //设置菜单项前面的图票为16X16的图片文件。 //subMenu.Image = imageList1.Images[int.Parse(dv[i]["I_TuBiaoSYH"].ToString())]; //subMenu.Image.Tag = dv[i]["I_TuBiaoSYH"].ToString(); //} //将菜单加到顶层菜单下。 topMenu.DropDownItems.Add(subMenu); } } /// <summary> /// 加载所选菜单对应的窗体 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void subMenu_Click(object sender, EventArgs e) { //tag属性在这里有用到。 string formName = ((ToolStripMenuItem)sender).Tag.ToString(); CreateFormInstance(formName); } //动态调用窗体 private void CreateFormInstance(string formName) { 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) { //如果不存在则用反射创建form窗体实例。 Assembly asm = Assembly.Load(Assembly.GetEntryAssembly().GetName().Name);//项目名 object frmObj = asm.CreateInstance("JuLong.CFMS.BankOutlet.WinForms." + formName);//程序集+form的类名。 Form frms = (Form)frmObj; frms.Tag = formName; //如果是父子窗体就用,不是不用 //frms.MdiParent = this; frms.ShowDialog(); } } } }