需要源代码吗?

解决方案 »

  1.   

         private void CreateMenu()
            {
                //定义一个主菜单
                MenuStrip mainMenu = new MenuStrip();
                DataSet ds = new DataSet();
                //从XML中读取数据。数据结构后面详细讲一下。
                ds.ReadXml(@"..\..\Menu.xml");
                DataView dv = ds.Tables[0].DefaultView;
                //通过DataView来过滤数据首先得到最顶层的菜单
                dv.RowFilter = "ParentItemID=0";
                for(int i=0; i<dv.Count;i++)
                {
                    //创建一个菜单项
                    ToolStripMenuItem topMenu = new ToolStripMenuItem();
                    //给菜单赋Text值。也就是在界面上看到的值。
                    topMenu.Text = dv[i]["Text"].ToString();
                    //如果是有下级菜单则通过CreateSubMenu方法来创建下级菜单
                    if (Convert.ToInt16(dv[i]["IsModule"]) == 1)
                    {
                        //以ref的方式将顶层菜单传递参数,因为他可以在赋值后再回传。--也许还有更好的方法^_^.
                        CreateSubMenu(ref topMenu, Convert.ToInt32(dv[i]["ItemID"]),ds.Tables[0]);
                    }
                    //显示应用程序中已打开的 MDI 子窗体列表的菜单项
                    mainMenu.MdiWindowListItem = topMenu;
                    //将递归附加好的菜单加到菜单根项上。
                    mainMenu.Items.Add(topMenu);
                }
                mainMenu.Dock = DockStyle.Top;
                //将窗体的MainMenuStrip梆定为mainMenu.
                this.MainMenuStrip = mainMenu;
                //这句很重要。如果不写这句菜单将不会出现在主窗体中。
                this.Controls.Add(mainMenu);
            }        private void CreateSubMenu(ref ToolStripMenuItem topMenu,int ItemID, DataTable dt)
            {
                DataView dv = new DataView(dt);
                //过滤出当前父菜单下在所有子菜单数据(仅为下一层的)
                dv.RowFilter = "ParentItemID=" + ItemID.ToString();
                
                for (int i = 0; i < dv.Count; i++)
                {
                    //创建子菜单项
                    ToolStripMenuItem subMenu = new ToolStripMenuItem();
                    subMenu.Text = dv[i]["Text"].ToString();
                    //如果还有子菜单则继续递归加载。
                    if (Convert.ToInt16(dv[i]["IsModule"]) == 1)
                    {
                        //递归调用
                        CreateSubMenu(ref subMenu, Convert.ToInt32(dv[i]["ItemID"]), dt);
                    }
                    else
                    {
                        //扩展属性可以加任何想要的值。这里用formName属性来加载窗体。
                        subMenu.Tag = dv[i]["FormName"].ToString();
                        //给没有子菜单的菜单项加事件。
                        subMenu.Click += new EventHandler(subMenu_Click);
                    }
                    if (dv[i]["ImageName"].ToString().Length > 0)
                    {
                        //设置菜单项前面的图票为16X16的图片文件。
                        Image img = Image.FromFile(@"..\..\Image\"+dv[i]["ImageName"].ToString());
                        subMenu.Image = img;
                        subMenu.Image.Tag = dv[i]["ImageName"].ToString();
                    }
                    //将菜单加到顶层菜单下。
                    topMenu.DropDownItems.Add(subMenu);
                }
            }
    或者把这转换成Sql语句的办法来取值。。都有分。。
      

  2.   

    楼主,你能把你的代码发完整吗?我asp.net熟,写桌面的不熟,我也想学习一下
      

  3.   

    搞定了
    SqlConnection conn = new SqlConnection("server=192.168.2.103;uid=ht1;pwd=821022;database=ht1");
            DataSet ds;
            public Form1()
            {
                InitializeComponent();
                conn.Open();
                this.createDataSet();            //conn.Close();
                this.CreateMenu();
                //
                conn.Close();
            }
            private DataSet createDataSet()
            {
                ds = new DataSet();
                string sqlStr = "select * from Sys_tree order by px";
                SqlDataAdapter cs = new SqlDataAdapter(sqlStr, conn);
                cs.Fill(ds, "Tree");
                return ds;
            }
            private void CreateMenu()
            {
                //定义一个主菜单 
                MenuStrip mainMenu = new MenuStrip();
                //DataSet ds = new DataSet();
                //从XML中读取数据。数据结构后面详细讲一下。 
                //ds.ReadXml(@"..\..\Menu.xml");
                DataView dv = ds.Tables[0].DefaultView;
                //通过DataView来过滤数据首先得到最顶层的菜单 
                dv.RowFilter = "PreviousId=0";
                for (int i = 0; i < dv.Count; i++)
                {
                    //创建一个菜单项 
                    ToolStripMenuItem topMenu = new ToolStripMenuItem();
                    //给菜单赋Text值。也就是在界面上看到的值。 
                    topMenu.Text = dv[i]["Name"].ToString();
                    //如果是有下级菜单则通过CreateSubMenu方法来创建下级菜单 
                    if (Convert.ToInt16(dv[i]["PreviousId"]) == 0)
                    {
                        //以ref的方式将顶层菜单传递参数,因为他可以在赋值后再回传。--也许还有更好的方法^_^. 
                        CreateSubMenu(ref topMenu, Convert.ToInt32(dv[i]["id"]), ds.Tables[0]);
                    }
                    //显示应用程序中已打开的 MDI 子窗体列表的菜单项 
                    mainMenu.MdiWindowListItem = topMenu;
                    //将递归附加好的菜单加到菜单根项上。 
                    mainMenu.Items.Add(topMenu);
                }
                mainMenu.Dock = DockStyle.Top;
                //将窗体的MainMenuStrip梆定为mainMenu. 
                this.MainMenuStrip = mainMenu;
                //这句很重要。如果不写这句菜单将不会出现在主窗体中。 
                this.Controls.Add(mainMenu);
            }        private void CreateSubMenu(ref ToolStripMenuItem topMenu, int ItemID, DataTable dt)
            {
                DataView dv = new DataView(dt);
                //过滤出当前父菜单下在所有子菜单数据(仅为下一层的) 
                dv.RowFilter = "PreviousId=" + ItemID.ToString();            for (int i = 0; i < dv.Count; i++)
                {
                    //创建子菜单项 
                    ToolStripMenuItem subMenu = new ToolStripMenuItem();
                    subMenu.Text = dv[i]["Name"].ToString();
                    //如果还有子菜单则继续递归加载。 
                    if (Convert.ToInt16(dv[i]["PreviousId"]) == 0)
                    {
                        //递归调用 
                        CreateSubMenu(ref subMenu, Convert.ToInt32(dv[i]["PreviousId"]), dt);
                    }
                    else
                    {
                        //扩展属性可以加任何想要的值。这里用formName属性来加载窗体。 
                        subMenu.Tag = dv[i]["Name"].ToString();
                        //给没有子菜单的菜单项加事件。 
                        subMenu.Click += new EventHandler(subMenu_Click);
                    }
                    if (dv[i]["Images"].ToString().Length > 0)
                    {
                        //设置菜单项前面的图票为16X16的图片文件。 
                        //Image img = Image.FromFile(@"..\..\Image\" + dv[i]["Images"].ToString());
                        //subMenu.Image = img;
                        //subMenu.Image.Tag = dv[i]["Images"].ToString();
                    }
                    //将菜单加到顶层菜单下。 
                    topMenu.DropDownItems.Add(subMenu);
                }
            }