首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

为何编历菜单时只能编历一级呢,怎么才使得编历所有菜单

2012-09-29 
为何编历菜单时只能编历一级呢,如何才使得编历所有菜单?我的代码:private void LoadUserPower(string user

为何编历菜单时只能编历一级呢,如何才使得编历所有菜单?
我的代码:
  private void LoadUserPower(string userPower)
  {
  foreach (System.Windows.Forms.ToolStripMenuItem item in this.menuStrip_main.Items) //分解权限列表,然后根据权限显示或隐藏工具和菜单栏
  {//首先遍历菜单栏
  ToolStripMenuItem menuBtn = item as ToolStripMenuItem;
  if (userPower.IndexOf(((ToolStripMenuItem)item).Text.Trim()) != -1)
  {//如果userPower字符串中存在菜单文本则可用,否则菜单不可用
  menuBtn.Enabled = true;
  }
  else
  {
  menuBtn.Enabled = false;
  }
  }


[解决办法]

C# code
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;namespace WinTest{    public partial class Form1 : Form    {        DataTable dt;        public Form1()        {            InitializeComponent();            dt = getdata();        }        public DataTable getdata()        {            DataTable dt = new DataTable();            dt.Columns.Add("id");            dt.Columns.Add("parentID");            dt.Columns.Add("title");            Random rand = new Random();            for (int i = 0; i < 15; i++)            {                DataRow dr = dt.NewRow();                dr[0] = i + 1;                dr[1] = (15 % (i + 1) == 0) ? "" : rand.Next(1, 10).ToString();                dr[2] = "name_" + (i + 1).ToString();                dt.Rows.Add(dr);            }            return dt;        }         private void button2_Click(object sender, EventArgs e)        {            DataRow[] drows = dt.Select("parentID=''");            if (drows.Length > 0)            {                foreach (DataRow item in drows)                {                    ToolStripMenuItem toolitem = new ToolStripMenuItem(item["title"].ToString());                    DataRow[] children = dt.Select(string.Format("parentID='{0}'", item["id"].ToString()));                    if (children.Length > 0)                    {                        bind(toolitem, item);                    }                    menuStrip2.Items.Add(toolitem);                }            }                    }        private void bind(ToolStripMenuItem item,DataRow dr)        {            DataRow[] rows =  dt.Select(string.Format("parentID='{0}'",dr["id"].ToString()));            if (rows.Length > 0)            {                foreach (DataRow drv in rows)                {                    bind(item,drv);                                 }            }             else            {                item.DropDownItems.Add(dr["title"].ToString());            }        }    }}
[解决办法]
上面的代码在构造DataTable的时候有问题,不好意思。请看下面的代码。这个是调试通过的。

C# code
 private void button2_Click(object sender, EventArgs e)        {            InitTree();        }        public void InitTree()        {            DataView dv = this.GetData();            dv.RowFilter = "ParentID=0";            foreach (DataRowView drv in dv)            {                ToolStripMenuItem node = new ToolStripMenuItem();                node.Text = drv["cname"].ToString();                this.menuStrip1.Items.Add(node);                BuildTree(dv, node,drv["cid"].ToString());            }        }        private void BuildTree(DataView dv, ToolStripMenuItem pnode,string parentID)        {            dv.RowFilter = "[ParentID]=" + parentID;            foreach (DataRowView drv in dv)            {                string name = drv["cname"].ToString();                ToolStripMenuItem cnode = new ToolStripMenuItem(name);                 DataView ddvv = dv;                ddvv.RowFilter = "[ParentID]=" + parentID;                if (ddvv.Count>0 )                {                    pnode.DropDownItems.Add(cnode);                    BuildTree(dv, cnode,drv["cid"].ToString());                }            }        }        private DataView GetData()        {            DataTable table = new DataTable();            table.Columns.Add("CID", typeof(int));            table.Columns.Add("CName", typeof(string));            table.Columns.Add("ParentID", typeof(int));            DataRow row0 = table.NewRow();            DataRow row1 = table.NewRow();            DataRow row2 = table.NewRow();            DataRow row3 = table.NewRow();            DataRow row4 = table.NewRow();            DataRow row5 = table.NewRow();            DataRow row6 = table.NewRow();            DataRow row7 = table.NewRow();            DataRow row8 = table.NewRow();            DataRow row9 = table.NewRow();            row0.ItemArray = new object[] { 1, ".net", 0 };            row1.ItemArray = new object[] { 2, "c#", 1 };            row2.ItemArray = new object[] { 3, "asp.net", 1 };            row3.ItemArray = new object[] { 4, "office", 0 };            row4.ItemArray = new object[] { 5, "word", 4 };            row5.ItemArray = new object[] { 6, "excel", 5 };            row6.ItemArray = new object[] { 7, "os", 0 };            row7.ItemArray = new object[] { 8, "unix", 7 };            row8.ItemArray = new object[] { 9, "linux", 8 };            row9.ItemArray = new object[] { 10, "c#.net", 2 };            table.Rows.Add(row0);            table.Rows.Add(row1);            table.Rows.Add(row2);            table.Rows.Add(row3);            table.Rows.Add(row4);            table.Rows.Add(row5);            table.Rows.Add(row6);            table.Rows.Add(row7);            table.Rows.Add(row8);            table.Rows.Add(row9);            return table.DefaultView;        } 


[解决办法]
你好,这个遍历菜单的操作用递归来,我简单说一下,只是看过别人写过自己没有写过,就是写一个检查菜单的函数,就是分析只有一级菜单的,然后循环依次去掉用这个函数,如果子菜单还有子项那么子项继续调用函数直到最后一程菜单。
[解决办法]
#region 窗体加载时加载权限
private void LoadUserPower(ToolStripItemCollection root, string userPower)
{
{
if (root.Count == 0)
return;
foreach (var obj in root)
{
if (obj is ToolStripMenuItem)
{
ToolStripMenuItem ddItem = obj as ToolStripMenuItem;
if (userPower.IndexOf(ddItem.Text) != -1)
{
ddItem.Enabled = true;
}
else
{
if (userPower.IndexOf(ddItem.Text) == -1)
{
ddItem.Enabled = false;
}
}

LoadUserPower(ddItem.DropDownItems, userPower);
}
}
}
}
#endregion


请试用!

热点排行