为何编历菜单时只能编历一级呢,如何才使得编历所有菜单?
我的代码:
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;
}
}
[解决办法]
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的时候有问题,不好意思。请看下面的代码。这个是调试通过的。
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
请试用!