c#遍历treeview的问题,实在没辙了 treeview遍历调试 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 第一眼看上去,代码有逻辑错误if (TNode.Tag.ToString() != "menu" || TNode.Tag == null)如果TNode.Tag为null,你直接ToString会有异常的,改成if (TNode.Tag == null || TNode.Tag.ToString() != "menu") 不是吧,如果是null,lz都不异常给贴出来了。估计是 return k.FormName == TNode.Tag.ToString(); 这句的原因 谢谢楼上两位,问题是 用户权限 这个节点被直接跳过去了,但是这个节点的tag不为null也不等于menu,好奇怪 那你看下它的tag是什么啊?如果是tag问题造成的不被遍历,你去看绑定treeview的代码呗 那你看下它的tag是什么啊?如果是tag问题造成的不被遍历,你去看绑定treeview的代码呗说不定 它的 tag=menu呢还 应该是这句的问题 return k.FormName == TNode.Tag.ToString(); 你用户权限节点传进去返回出来的东西为null,所以导致后面 if (lsUserAuthFind == null) TNode.Remove(); 被remove掉了 可以用递归遍历所有节点private void readAllNodes(TreeNodeCollection nodes){ foreach (TreeNode node in nodes) { Debug.Print(node.Text); readAllNodes(node.Nodes); }} 调用:readAllNodes(TreeView1.Nodes) private void readAllNodes(TreeNodeCollection nodes){ foreach (TreeNode node in nodes) { Debug.Print(node.Text); readAllNodes(node.Nodes); }} 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);//调用递归方法 } } } C#多线程的问题,高手帮帮忙 模态窗体和非模态窗体的区别?如何打开它们? VB的代码是否可以转换成C#的 求一正则表达式,找html源文件的地址 如何制作ie ActiveX (ie插件) 啊 怎么判断 一个对象是否实例化 大量sql语句一起执行的问题 静态变量,多个用户会串值么? ~~~~~~~~~~~~~~~~~~~ 求一固定格式正则表达式 如何读取Excel某工作簿中某个单元格的值? 想法是这样的:点击详细信息,弹出一个窗体,我能获取到这行的ID么? 串口通信,接收问题,新手求指教!!!!!
if (TNode.Tag.ToString() != "menu" || TNode.Tag == null)
如果TNode.Tag为null,你直接ToString会有异常的,改成
if (TNode.Tag == null || TNode.Tag.ToString() != "menu")
说不定 它的 tag=menu呢还
private void readAllNodes(TreeNodeCollection nodes)
{
foreach (TreeNode node in nodes) {
Debug.Print(node.Text);
readAllNodes(node.Nodes);
}
}
readAllNodes(TreeView1.Nodes)
{
foreach (TreeNode node in nodes) {
Debug.Print(node.Text);
readAllNodes(node.Nodes);
}
}
// 将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);//调用递归方法
}
}
}