c#遍历treeview的问题,实在没辙了

stayweb 2014-11-12 10:28:15
树的截图:



下面是遍历的代码:

private void setNodeAuth(TreeNodeCollection tc, List<yssb.Model.yssb_UserAuth> lsUA)
{
try
{
foreach (TreeNode TNode in tc)
{
if (TNode.Tag.ToString() != "menu" || TNode.Tag == null)
{
lsUserAuthFind = lsUA.Find((yssb.Model.yssb_UserAuth k) => { return k.FormName == TNode.Tag.ToString(); });
if (lsUserAuthFind == null)
{
TNode.Remove();
}
}
setNodeAuth(TNode.Nodes, lsUA);
}
}
catch (Exception ex) { Common.Msg.ShowException(ex); }
}


那么问题来了:

遍历的时候不能获得所有的节点,经我实测,用户权限这个节点就丢了,但是我看了这个节点的属性与其他的节点无异,调试的时候发现这个节点就没有循环,我想应该是遍历逻辑的问题,但是搞了一上午也没办法,求坛里大神支招啊!!!
...全文
228 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
dlx_2632641148 2014-11-13
  • 打赏
  • 举报
回复
C#遍历treeview节点示例 // 将MenuStrip控件中的首行命令项添加到TreeView控件中 // <param treeV="TreeView">TreeView控件</param> // <param MenuS="MenuStrip">MenuStrip控件</param> public void GetMenu(TreeView treeV, MenuStrip MenuS) { bool Var_Bool = true; for (int i = 0; i < MenuS.Items.Count; i++) //遍历MenuStrip组件中的一级菜单项 { //将一级菜单项的名称添加到TreeView组件的根节点中,并设置当前节点的子节点newNode1 TreeNode newNode1 = treeV.Nodes.Add(MenuS.Items[i].Text); if (MenuS.Items[i].Enabled == false)//判断当前项是否为可用 { newNode1.ForeColor = Color.Silver;//改变树节点的字体颜色为不可用色 Var_Bool = false; } else { newNode1.ForeColor = Color.Black;//改变树节点的字体颜色为可用色 Var_Bool = true; }//codego.net/tags/23/1/ newNode1.Tag = 0;//标识,有子项的命令项 //将当前菜单项的所有相关信息存入到ToolStripDropDownItem对象中 ToolStripDropDownItem newmenu = (ToolStripDropDownItem)MenuS.Items[i]; GetCavernMenu(newNode1, newmenu, Var_Bool);//添加多层命令项 } } // 将MenuStrip控件中的多层命今项添加到TreeView控件中 // <param newNodeA="TreeNode">TreeNode对象</param> // <param newmenuA="ToolStripDropDownItem">ToolStripDropDownItem对象</param> // <param BL="bool">标识(是否可用)</param> public void GetCavernMenu(TreeNode newNodeA, ToolStripDropDownItem newmenuA, bool BL) { bool Var_Bool = true; if (newmenuA.HasDropDownItems && newmenuA.DropDownItems.Count > 0) for (int j = 0; j < newmenuA.DropDownItems.Count; j++) //遍历二级菜单项 { //将二级菜单名称添加到TreeView组件的子节点newNode1中,并设置当前节点的子节点newNode2 TreeNode newNodeB = newNodeA.Nodes.Add(newmenuA.DropDownItems[j].Text); Var_Bool = true; if (BL == false)//判断当前命令项的上一级命令是否可用 { newNodeB.ForeColor = Color.Silver;//设置当前命令项的字体颜色为不可用色 newNodeB.Tag = 0;//标识,不显示相应的窗体 Var_Bool = false; } else { if (newmenuA.DropDownItems[j].Enabled == false)//判断当前命令项是否为可用 { newNodeB.ForeColor = Color.Silver;//设置当前命令项的字体颜色为不可用色 newNodeB.Tag = 0;//标识,不显示相应的窗体 Var_Bool = false; } else { newNodeA.ForeColor = Color.Black;//设置当前命令项的字体颜色为可用色 newNodeB.Tag = int.Parse(newmenuA.DropDownItems[j].Tag.ToString());//标识,显示相应的窗体 } } //将当前菜单项的所有相关信息存入到ToolStripDropDownItem对象中 ToolStripDropDownItem newmenuB = (ToolStripDropDownItem)newmenuA.DropDownItems[j]; if (newmenuB.HasDropDownItems && newmenuA.DropDownItems.Count > 0)//如果当前命令项有子项 { newNodeB.Tag = 0;//标识,有子项的命令项 GetCavernMenu(newNodeB, newmenuB, Var_Bool);//调用递归方法 } } }
hwangt0 2014-11-12
  • 打赏
  • 举报
回复
应该是这句的问题 return k.FormName == TNode.Tag.ToString(); 你用户权限节点传进去返回出来的东西为null,所以导致后面 if (lsUserAuthFind == null) TNode.Remove(); 被remove掉了
exception92 2014-11-12
  • 打赏
  • 举报
回复
引用 4 楼 lovelj2012 的回复:
[quote=引用 3 楼 stayweb 的回复:] 谢谢楼上两位,问题是 用户权限 这个节点被直接跳过去了,但是这个节点的tag不为null也不等于menu,好奇怪
那你看下它的tag是什么啊?如果是tag问题造成的不被遍历,你去看绑定treeview的代码呗[/quote] 说不定 它的 tag=menu呢还
江南小鱼 2014-11-12
  • 打赏
  • 举报
回复
引用 3 楼 stayweb 的回复:
谢谢楼上两位,问题是 用户权限 这个节点被直接跳过去了,但是这个节点的tag不为null也不等于menu,好奇怪
那你看下它的tag是什么啊?如果是tag问题造成的不被遍历,你去看绑定treeview的代码呗
stayweb 2014-11-12
  • 打赏
  • 举报
回复
谢谢楼上两位,问题是 用户权限 这个节点被直接跳过去了,但是这个节点的tag不为null也不等于menu,好奇怪
exception92 2014-11-12
  • 打赏
  • 举报
回复
不是吧,如果是null,lz都不异常给贴出来了。估计是 return k.FormName == TNode.Tag.ToString(); 这句的原因
江南小鱼 2014-11-12
  • 打赏
  • 举报
回复
第一眼看上去,代码有逻辑错误
if (TNode.Tag.ToString() != "menu" || TNode.Tag == null)
如果TNode.Tag为null,你直接ToString会有异常的,改成
if (TNode.Tag == null || TNode.Tag.ToString() != "menu")
那城 2014-11-12
  • 打赏
  • 举报
回复
private void readAllNodes(TreeNodeCollection nodes) { foreach (TreeNode node in nodes) { Debug.Print(node.Text); readAllNodes(node.Nodes); } }
zj_zwl 2014-11-12
  • 打赏
  • 举报
回复
调用:


readAllNodes(TreeView1.Nodes)

zj_zwl 2014-11-12
  • 打赏
  • 举报
回复
可以用递归遍历所有节点


private void readAllNodes(TreeNodeCollection nodes)
{
	foreach (TreeNode node in nodes) {
		Debug.Print(node.Text);
		readAllNodes(node.Nodes);
	}
}


110,535

社区成员

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

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

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