我用下面的代码通过读取 xml 文件创建一个 winform TreeView:public void CreateTree(System.Windows.Forms.TreeView tv)
{
    try
    {
        _xDoc.Load(_xmlFilePath);
        tv.Nodes.Clear();
        tv.Nodes.Add(new System.Windows.Forms.TreeNode(_xDoc.DocumentElement.Attributes["Title"].Value));
        System.Windows.Forms.TreeNode tNode = new System.Windows.Forms.TreeNode();
        tNode = tv.Nodes[0]; // 读取顶节
        tNode.Checked = true; // 将该复选框设置为选中
        tNode.Tag = _xDoc.DocumentElement.Attributes["id"].Value;
        AddTreeNode(_xDoc.DocumentElement, tNode);
        tv.ExpandAll();
    }
    catch
    {
        //
    }
}private void AddTreeNode(XmlNode x, System.Windows.Forms.TreeNode t)
{
    XmlNode xNode;
    XmlNodeList xNodeList;    if (x.HasChildNodes)
    {
        xNodeList = x.ChildNodes;        for (int i = 0; i < xNodeList.Count; i++)
        {
            xNode = x.ChildNodes[i];            t.Nodes.Add(new System.Windows.Forms.TreeNode(xNode.Attributes["Title"].Value));
            t.Nodes[i].Tag = xNode.Attributes["id"].Value;
            t.Nodes[i].Checked = Convert.ToBoolean(xNode.Attributes["IsShow"].Value);
            AddTreeNode(xNode, t.Nodes[i]);
        }
    }
    else
        return;
}上面的代码可以正确运行。但当我添加了下面的判断后,递归一旦发现不符合条件的话,就跳出去了:private void AddTreeNode(XmlNode x, System.Windows.Forms.TreeNode t)
{
    XmlNode xNode;
    XmlNodeList xNodeList;    if (x.HasChildNodes)
    {
        xNodeList = x.ChildNodes;        for (int i = 0; i < xNodeList.Count; i++)
        {
            xNode = x.ChildNodes[i];
            
            if (Convert.ToBoolean(xNode.Attributes["IsShow"].Value)) // 和上面的递归相比,增加了这行。
                t.Nodes.Add(new System.Windows.Forms.TreeNode(xNode.Attributes["Title"].Value));            t.Nodes[i].Tag = xNode.Attributes["id"].Value;
            t.Nodes[i].Checked = Convert.ToBoolean(xNode.Attributes["IsShow"].Value);
            AddTreeNode(xNode, t.Nodes[i]);
        }
    }
    else
        return;
}本人才学疏浅,对递归也不太会用,代码是直接抄msdn的,但不曾想只加了个判断,就挂了~ T-T 
加了判断后,现实的结果是,只要发现 if(false) 的时候,其他所有项都干脆不建立了~我现在想要的是,如何能成功在这个递归里添加这个判断呢?100 分求助~

解决方案 »

  1.   

    Convert.ToBoolean(xNode.Attributes["IsShow"].Value)
    你這個是不是異常了,不然怎么會跳出去
    你在IF前面看下:MessageBox.Show(xNode.Attributes["IsShow"].Value);是不是為空或者Null.
      

  2.   


    就是跳出去了,IsShow 不为空。
      

  3.   

    if (Convert.ToBoolean(xNode.Attributes["IsShow"].Value)) // 和上面的递归相比,增加了这行。
                    t.Nodes.Add(new System.Windows.Forms.TreeNode(xNode.Attributes["Title"].Value));
    你加了判断,如果抱错,这地方距不能执行,没有添加节点,后面的肯定不能进行了
      if (Convert.ToBoolean(xNode.Attributes["IsShow"].Value)) // 和上面的递归相比,增加了这行。
                   { t.Nodes.Add(new System.Windows.Forms.TreeNode(xNode.Attributes["Title"].Value));            t.Nodes[i].Tag = xNode.Attributes["id"].Value;
                t.Nodes[i].Checked = Convert.ToBoolean(xNode.Attributes["IsShow"].Value);
                AddTreeNode(xNode, t.Nodes[i]);
    }
    这样就是只要不符合,就全部不添加!
      

  4.   

    if (Convert.ToBoolean(xNode.Attributes["IsShow"].Value)) // 和上面的递归相比,增加了这行。
                    t.Nodes.Add(new System.Windows.Forms.TreeNode(xNode.Attributes["Title"].Value));
    else
        t.Nodes.Add(new System.Windows.Forms.TreeNode(""));加个else试一下.
      

  5.   

    我的资源里有相应的demo,是很久之前写的,现在看来代码结构很垃圾,但希望对你有些帮助
      

  6.   


    加了else可以执行,但 treeview 显示了一个空节点。我现在想要的是不显示这个节点~
      

  7.   

    public void CreateTree(System.Windows.Forms.TreeView tv)
    {
        try
        {
            _xDoc.Load(_xmlFilePath);
            tv.Nodes.Clear();
            tv.Nodes.Add(new System.Windows.Forms.TreeNode(_xDoc.DocumentElement.Attributes["Title"].Value));
            System.Windows.Forms.TreeNode tNode = new System.Windows.Forms.TreeNode();
            tNode = tv.Nodes[0]; // 读取顶节
            tNode.Checked = true; // 将该复选框设置为选中
            tNode.Tag = _xDoc.DocumentElement.Attributes["id"].Value;
            AddTreeNode(_xDoc.DocumentElement, tNode);
            tv.ExpandAll();
        }
        catch
        {
            tv.Enabled = false;
        }
    }我在 catch 内添加了这行,一旦发生错误,则令 treeview 失效,但运行时 treeview 并没有失效。所以那个判断应该没有发生错误。
      

  8.   

    private void AddTreeNode(XmlNode x, System.Windows.Forms.TreeNode t)
    {
        XmlNode xNode;
        XmlNodeList xNodeList;    if (x.HasChildNodes)
        {
            xNodeList = x.ChildNodes;        for (int i = 0; i < xNodeList.Count; i++)
            {
                xNode = x.ChildNodes[i];
                
                if (Convert.ToBoolean(xNode.Attributes["IsShow"].Value)) // 和上面的递归相比,增加了这行。
                    t.Nodes.Add(new System.Windows.Forms.TreeNode(xNode.Attributes["Title"].Value));            t.Nodes[i].Tag = xNode.Attributes["id"].Value;
                t.Nodes[i].Checked = Convert.ToBoolean(xNode.Attributes["IsShow"].Value);
                AddTreeNode(xNode, t.Nodes[i]);
            }
        }
        else
            return;
    }你在这里设一个断点跟踪一下.如果不满足if条件,是继续往后面执行,你这个判断只是看看IsShow是否为true,如果为true的话添加一个节点.如果false的话就不添加节点.也就是和你上面"正确"的代码相比,这个构造出来的tree也只是节点多少的差别而已
    然后你那个else 的return可以去掉
      

  9.   

    至于你说的:递归一旦发现不符合条件的话,就跳出去了
    这个对递归我没看出有什么影响,就算它不执行到if (Convert.ToBoolean(xNode.Attributes["IsShow"].Value))里面去的话,后面照样会调用  AddTreeNode(xNode, t.Nodes[i]); 不是一样会递归的么?
      

  10.   

    按我9楼说的,在if那里打个断点,一步一步往下走,看看不满足if时,程序到了 AddTreeNode(xNode, t.Nodes[i])后
    t.Nodes[i]的值是多少,递归后到了  if (x.HasChildNodes) 后看看是否满足,如果满足的话这时的x.ChildNodes值又是多少.这样一步一步的就你知道原因了,
      

  11.   

    不好意思各位,因为设置了颜色,所以之前看错了,当我在 catch() 内添加了 tv.Enabled = false 后,确实出错了。错误内容如下:http://ngfnet.cn:8080/csdn/123.jpg截了图~是台破机子,所以可能比较慢:错误:指定的参数已超出有效值的范围。
      

  12.   

    你F10一步一步走,我想知道的是如果if (Convert.ToBoolean(xNode.Attributes["IsShow"].Value))没有满足
    后面有没有走到AddTreeNode(xNode, t.Nodes[i])?
    如果走到了,递归时if (x.HasChildNodes)有没有满足,你就在
    两个if条件和AddTreeNode这里加断点,看看第二次有没有执行就对了
      

  13.   


    没有走到,在前一行 t.Nodes[i].Tag = xNode.Attributes["id"].Value; 已报出错误:指定的参数已超出有效值的范围。
      

  14.   

    现在我觉得应该是,当遇到 if(false) 时:xNode 已跳过了 i ,但 t.Nodes[i] 却继续了,所以产生了错误。
      

  15.   

    if (x.HasChildNodes)
    {
        xNodeList = x.ChildNodes;
        for (int i = 0, j=0; i < xNodeList.Count; i++)
        {
            xNode = x.ChildNodes[i];
            if (!IsAdministrator)
            {
                if (Convert.ToBoolean(xNode.Attributes["IsShow"].Value))
                {
                    t.Nodes.Add(new System.Windows.Forms.TreeNode(xNode.Attributes["Title"].Value));
                    j++;
                }
            }
            else
            {
                t.Nodes.Add(new System.Windows.Forms.TreeNode(xNode.Attributes["Title"].Value));
                t.Nodes[j].Checked = Convert.ToBoolean(xNode.Attributes["IsShow"].Value);
                j++;
            }        if (Convert.ToBoolean(xNode.Attributes["Is2ndSite"].Value))
                t.Nodes[j].BackColor = System.Drawing.Color.Yellow;
            t.Nodes[j].Tag = xNode.Attributes["id"].Value;
            AddTreeNode(xNode, t.Nodes[j], IsAdministrator);
        }
    }问题采用上面的办法解决了,谢谢各位!