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

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;
}
}
...全文
236 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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~ 系统自动屏蔽 所有回答
DirectX修复工具(DirectX Repair)是一款系统级工具软件,简便易用。本程序为绿色版,无需安装,可直接运行。 本程序的主要功能是检测当前系统的DirectX状态,如果发现异常则进行修复。程序主要针对0xc000007b问题设计,可以完美修复该问题。本程序中包含了最新版的DirectX redist(Jun2010),并且全部DX文件都有Microsoft的数字签名,安全放心。 本程序为了应对一般电脑用户的使用,采用了傻瓜式一键设计,只要点击主界面上的“检测并修复”按钮,程序就会自动完成校验、检测、下载、修复以及注册的全部功能,无需用户的介入,大大降低了使用难度。 本程序适用于多个操作系统,如Windows XP(需先安装.NET 2.0,详情请参阅“致Windows XP用户.txt”文件)、Windows Vista、Windows 7、Windows 8、Windows 8.1、Windows 8.1 Update、Windows 10,同兼容32位操作系统和64位操作系统。本程序会根据系统的不同,自动调整任务模式,无需用户进行设置。 本程序的V3.3版分为标准版、增强版以及在线修复版。其中的标准版以及增强版都包含完整的DirectX组件。除此之外,增强版中还额外包含了c++ Redistributable Package,因此增强版不但能解决DirectX组件的问题,而且还能解决c++组件异常产生的问题。增强版适合无法自行解决c++相关问题的用户使用。在线修复版的功能与标准版相同,只是其所需的文件将通过Internet下载,因此大大减小了程序的体积。本程序的各个版本之间,主程序完全相同,只是配套使用的数据包不同。因此,当您使用标准版数据包,程序将进行标准修复;当您使用增强版的数据包,程序将进行增强修复;当数据包不全或没有数据包(即只有DirectX Repair.exe程序),程序将进行在线修复。在线修复、离线修复可自由灵活组合,充分满足不同用户的需要。 本程序自V2.0版起采用全新的底层程序架构,使用了异步多线程编程技术,使得检测、下载、修复单独进行,互不干扰,快速如飞。新程序更改了自我校验方式,因此使用新版本的程序不会再出现自我校验失败的错误;但并非取消自我校验,因此程序安全性与之前版本相同,并未降低。 程序有自动更新c++功能。由于绝大多数软件运行需要c++的支持,并且c++的异常也会导致0xc000007b错误,因此程序在检测修复的同,也会根据需要更新系统中的c++组件。自V3.2版本开始使用了全新的c++扩展包,可以大幅提高工业软件修复成功的概率。修复c++的功能仅限于增强版,标准版及在线修复版在系统c++异常(非丢失)会提示用户使用增强版进行修复。 程序有两种窗口样式。正常模式即默认样式,适合绝大多数用户使用。另有一种简约模式,此窗口将只显示最基本的内容,修复会自动进行,修复完成10秒钟后会自动退出。该窗口样式可以使修复工作变得更加简单快速,同方便其他软件、游戏将本程序内嵌,即可进行无需人工参与的快速修复。开启简约模式的方法是:打开程序所在目录下的“Settings.ini”文件(如果没有可以自己创建),将其中的“FormStyle”一项的值改为“Simple”并保存即可。 程序有高级筛选功能,开启该功能后用户可以自主选择要修复的文件,避免了其他不必要的修复工作。同,也支持通过文件进行辅助筛选,只要在程序目录下建立“Filter.dat”文件,其中的每一行写一个需要修复文件的序号即可。该功能仅针对高级用户使用,并且必须在正常窗口模式下才有效(简约模式无效)。 本程序有自动记录日志功能,可以记录每一次检测修复结果,方便在出现问题,及分析和查找原因,以便找到解决办法。 程序的“选项”对话框中包含了4项高级功能。点击其中的“注册系统文件夹中所有dll文件”按钮可以自动注册系统文件夹下的所有dll文件。该项功能不仅能修复DirectX的问题,还可以修复系统中很多其他由于dll未注册而产生的问题,颇为实用。点击该按钮旁边的小箭头,还可以注册任意指定文件夹下的dll文件,方便用户对绿色版、硬盘版的程序组件进行注册。点击第二个按钮可以为dll文件的右键菜单添加“注册”和“卸载”项,方便对单独的dll文件进行注册。请注意,并不是所有的dll文件都可以通过这种方式注册。点击“DirectX版本”选项卡可以自行修改系统中DirectX的版本信息。点击“DirectX加速”选项卡可以控制系统中DirectX加速的开启与关闭。 新版程序集成了用户反馈程序,可以在用户允许的前提下发送检测修复结果。用户也可以在出现问题通过反馈程序和软件作者进行交流,共同查找问题。反馈是完全自愿和匿名(如果不填写E-mail地址)的。 本程序的通用版基于Microsoft .NET Framework 2.0开发,对于Windows 2000、Windows XP、Windows 2003的用户需要首先安装.NET Framework 2.0或更高版本方可运行本程序。有关下载和安装的详细信息请参阅“致Windows XP用户.txt”文件。对于Windows Vista、Windows 7及后续用户,可以直接运行本程序。 同鉴于Windows 8(Windows 8.1、Windows 8.1 Update)、Windows 10系统中默认未包含.NET Framework 2.0,因此新版的程序文件夹内将包含一个DirectX_Repair_win8的特别版程序,该程序功能与通用版相同,基于.NET Framework 4.0开发,可以在Windows8(Windows 8.1、Windows 8.1 Update)、Windows 10系统中直接运行(其他系统如果安装了.NET Framework 4.0也可以运行这个特别版的程序)。 本程序的官方博客地址为:http://blog.csdn.net/vbcom/article/details/6962388 所有的更新以及技术支持都可以到该博客上找到。

111,094

社区成员

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

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

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