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

whh764224646 2012-09-16 04:36:44
我的代码:
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;
}
}
...全文
235 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
qjw9004 2012-09-22
  • 打赏
  • 举报
回复
#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


请试用!
独孤侠客 2012-09-18
  • 打赏
  • 举报
回复
你好,这个遍历菜单的操作用递归来,我简单说一下,只是看过别人写过自己没有写过,就是写一个检查菜单的函数,就是分析只有一级菜单的,然后循环依次去掉用这个函数,如果子菜单还有子项那么子项继续调用函数直到最后一程菜单。
独孤侠客 2012-09-18
  • 打赏
  • 举报
回复
你好,这个遍历菜单的操作用递归来,我简单说一下,只是看过别人写过自己没有写过,就是写一个检查菜单的函数,就是分析只有一级菜单的,然后循环依次去掉用这个函数,如果子菜单还有子项那么子项继续调用函数直到最后一程菜单。
独孤侠客 2012-09-18
  • 打赏
  • 举报
回复
你好,这个遍历菜单的操作用递归来,我简单说一下,只是看过别人写过自己没有写过,就是写一个检查菜单的函数,就是分析只有一级菜单的,然后循环依次去掉用这个函数,如果子菜单还有子项那么子项继续调用函数直到最后一程菜单。
cherho0 2012-09-18
  • 打赏
  • 举报
回复

给你个我原来写的递归,反正就是调用本身就是递归了,你看着改一下

private void MyTreeView(IList<DeptInfo> depts, string ParentID, TreeNode PNode)
{
depts = GetDeptInfos();
List<DeptInfo> newdepts = new List<DeptInfo>();
IList<EmpInfo> emps = GetEmpInfo();
for (int i = 0; i < depts.Count; i++)
{
if (depts[i].DeptId.ToString().Equals(ParentID))
{
newdepts.Add(depts[i]);
}

}
try
{
if (newdepts.Count > 0)
{
foreach (DeptInfo dept in newdepts)
{

System.Windows.Forms.TreeNode TNode = new System.Windows.Forms.TreeNode(); //创建TNode对像
TNode.Text = dept.Name;
TNode.Name = Convert.ToString(dept.Id);
TNode.Tag = Convert.ToString(dept.DeptId);
TNode.ImageIndex = 1;
TNode.SelectedImageIndex = 1;
TNode.StateImageIndex = 1;
TNode.ContextMenuStrip = cmDept;
TNode.NodeFont = new Font("宋体", 10f);
//显示子点文本
if (PNode == null)
{
this.trvDept.Nodes.Add(TNode);
foreach (EmpInfo emp in emps)
{

if (emp.DeptId == dept.Id)
{
TreeNode empn = new TreeNode();
empn.ForeColor = Color.BlueViolet;
empn.NodeFont = new Font("宋体",9f);
empn.Text = emp.Name;
empn.Name = emp.Id.ToString();
empn.ImageIndex = 0;
empn.ContextMenuStrip = cmUser;
TNode.Nodes.Add(empn);
}
}

}

else
{
PNode.Nodes.Add(TNode);
foreach (EmpInfo emp in emps)
{
if (emp.DeptId == dept.Id)
{
TreeNode empn = new TreeNode();
empn.ForeColor = Color.BlueViolet;
empn.NodeFont = new Font("宋体", 9f);
empn.Text = emp.Name;
empn.Name = emp.Id.ToString();
empn.ImageIndex = 0;
empn.ContextMenuStrip = cmUser;
TNode.Nodes.Add(empn);
}
}

//添加子节点
}

MyTreeView(depts, dept.Id.ToString(), TNode); //调用MyTreeView
}
}
else
{
return;
}
}
catch (Exception exp)
{
MessageBox.Show(exp.Message); //提示错误信息
}
}
victo7 2012-09-18
  • 打赏
  • 举报
回复
@whh764224646:
我的代码就是告诉你如何写递归的啊。郁闷。
whh764224646 2012-09-18
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

你好,这个遍历菜单的操作用递归来,我简单说一下,只是看过别人写过自己没有写过,就是写一个检查菜单的函数,就是分析只有一级菜单的,然后循环依次去掉用这个函数,如果子菜单还有子项那么子项继续调用函数直到最后一程菜单。
[/Quote]
能否有源码分享一下呢?我的QQ邮箱:191971159@qq.com 谢谢!
whh764224646 2012-09-17
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

http://img.my.csdn.net/uploads/201209/17/1347884753_5642.png
[/Quote]
你好!你可能没理解我想要的效果吧!
我想要的效果是
我从数据库中读取到权限字符串为“系统管理:密码及登陆名:重新登陆:退出:辅助工具:计算器:摄像头照相”
在menuStrip控件中有很多菜单项,如果菜单名有包涵在权限字符串中则为可用(.Enabled = true),否则不可用(.Enabled = false)。
如:菜单名为“重新登陆”则启用该菜单名(“重新登陆”在权限字符串中有)
又如:菜单名为“数据维护”则屏蔽该菜单名(“数据维护”在权限字符串中没有)

xb12369 2012-09-17
  • 打赏
  • 举报
回复
ToolStripDropDownItem newmenu2 = (ToolStripDropDownItem)newmenu.DropDownItems[j];

这样转换一下:


ToolStripDropDownItem newmenu2 = (System.Windows.Forms.ToolStripDropDownItem)newmenu.DropDownItems[j];

或者用as,这里可能是你转换错误!
whh764224646 2012-09-17
  • 打赏
  • 举报
回复
有人帮看看没?
victo7 2012-09-17
  • 打赏
  • 举报
回复
上面的代码在构造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;
}
victo7 2012-09-17
  • 打赏
  • 举报
回复

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());
}
}
}
}

whh764224646 2012-09-16
  • 打赏
  • 举报
回复
private void LoadUserPower(MenuStrip MenuS, string userPower)
{
for (int i = 0; i < MenuS.Items.Count; i++) //遍历MenuStrip控件中主菜单项
{
if (userPower.IndexOf(((ToolStripDropDownItem)MenuS.Items[i]).Text) != -1) //当节点名称与菜单项名称相等时
{
((ToolStripDropDownItem)MenuS.Items[i]).Enabled = true;
}
else
{
((ToolStripDropDownItem)MenuS.Items[i]).Enabled = false;
}
ToolStripDropDownItem newmenu = (ToolStripDropDownItem)MenuS.Items[i];
if (newmenu.HasDropDownItems && newmenu.DropDownItems.Count > 0) //遍历二级菜单项
for (int j = 0; j < newmenu.DropDownItems.Count; j++)
{
if (userPower.IndexOf((newmenu.DropDownItems[j]).Text) != -1)
{
(newmenu.DropDownItems[j]).Enabled = true;
}
else
{
(newmenu.DropDownItems[j]).Enabled = false;
}
//ToolStripDropDownItem newmenu2 = (ToolStripDropDownItem)newmenu.DropDownItems[j];
ToolStripDropDownItem newmenu2 = (ToolStripDropDownItem)newmenu.DropDownItems[j];
if (newmenu2.HasDropDownItems && newmenu2.DropDownItems.Count > 0) //遍历三级菜单项
for (int p = 0; p < newmenu2.DropDownItems.Count; p++)
{
if (userPower.IndexOf((newmenu2.DropDownItems[p]).Text) != -1)
{
(newmenu2.DropDownItems[p]).Enabled = true;
}
else
{
(newmenu2.DropDownItems[p]).Enabled = false;
}
}
}
}
}

花了一天的时间来研究写出来,但还是有错误
ToolStripDropDownItem newmenu2 = (ToolStripDropDownItem)newmenu.DropDownItems[j];
错误提示:
无法将类型为“System.Windows.Forms.ToolStripSeparator”的对象强制转换为类型“System.Windows.Forms.ToolStripDropDownItem”。
请前辈指点!谢谢~~
whh764224646 2012-09-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
for(){
for(){
for(){

}
}
}
[/Quote]
嗨!一头雾水!
rayyu1989 2012-09-16
  • 打赏
  • 举报
回复
for(){
for(){
for(){

}
}
}
whh764224646 2012-09-16
  • 打赏
  • 举报
回复
能有朋友细讲一下吗?在线等待!
whh764224646 2012-09-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
使用递归遍历 树状菜单

-------------------

看完请结贴
[/Quote]
能否细说呢?刚学的不大理解如何递归遍历!
瑞卡哥哥 2012-09-16
  • 打赏
  • 举报
回复
使用递归遍历 树状菜单

-------------------

看完请结贴
瑞卡哥哥 2012-09-16
  • 打赏
  • 举报
回复
whh764224646
(whh764224646)

等 级:
结帖率:0.00%



-----------------------------------
你的结贴率为0~ 系统自动屏蔽 所有回答

110,825

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧