解决方案 »

  1.   

    第一眼看上去,代码有逻辑错误
    if (TNode.Tag.ToString() != "menu" || TNode.Tag == null)
    如果TNode.Tag为null,你直接ToString会有异常的,改成
    if (TNode.Tag == null || TNode.Tag.ToString() != "menu")
      

  2.   

    不是吧,如果是null,lz都不异常给贴出来了。估计是 return k.FormName == TNode.Tag.ToString(); 这句的原因
      

  3.   

    谢谢楼上两位,问题是  用户权限 这个节点被直接跳过去了,但是这个节点的tag不为null也不等于menu,好奇怪
      

  4.   

    那你看下它的tag是什么啊?如果是tag问题造成的不被遍历,你去看绑定treeview的代码呗
      

  5.   

    那你看下它的tag是什么啊?如果是tag问题造成的不被遍历,你去看绑定treeview的代码呗
    说不定 它的 tag=menu呢还
      

  6.   

    应该是这句的问题     return k.FormName == TNode.Tag.ToString();    你用户权限节点传进去返回出来的东西为null,所以导致后面  if (lsUserAuthFind == null)  TNode.Remove();  被remove掉了
      

  7.   

    可以用递归遍历所有节点
    private void readAllNodes(TreeNodeCollection nodes)
    {
    foreach (TreeNode node in nodes) {
    Debug.Print(node.Text);
    readAllNodes(node.Nodes);
    }
    }
      

  8.   

    调用:
    readAllNodes(TreeView1.Nodes)
      

  9.   

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

  10.   

    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);//调用递归方法
                        }
                    }
            }