代码之家  ›  专栏  ›  技术社区  ›  alexD

.NET TreeView在尝试检查父节点时导致应用程序崩溃

  •  1
  • alexD  · 技术社区  · 16 年前

    我有一个带有复选框的TreeView,当用户选中一个子节点时,我想在树上检查每个父节点。但是,由于某些原因,每当我接触父节点时,我的应用程序就会爆炸。对于树中的节点,我已经扩展了TreeNode来创建我自己的对象,其中包含一些我需要存储在其中的数据,但是在选中/取消选中时,我仍然将它们引用为TreeNode。我的代码如下所示:

    //checkBox checked event handler
        if (node.Parent != null)
        {
            checkAllParents(node.Parent);
        }
    //
    
    private void checkAllParents(TreeNode node)
    {
        node.Checked = true;
        if (node.Parent != null)
        {
           checkAllParents(node.Parent);
        }
    }
    
    3 回复  |  直到 16 年前
        1
  •  2
  •   alexD    16 年前

    好吧,我想出来了。它不是一个循环引用,但它在本质上肯定是循环的。这对我来说是一个愚蠢的错误..在事件处理程序中,我也在使用递归来检查树..我在前一段时间实现了它,但没有真正考虑它,因此,当我添加另一个递归来检查树时,我在递归函数和事件处理程序之间得到了一个无限循环(每次递归函数检查其中一个节点时都会调用它..After\u checked事件)。呸。

        2
  •  0
  •   Patko    16 年前

    // checkBox checked event handler
    checkAllParents(node);
    
    private void checkAllParents(TreeNode node)
    {
      var parent = node.Parent;
      while (parent != null) {
      {
        parent.Checked = true;
        parent = parent.Parent;
      }
    }
    

    如果应用程序进入无限循环,那么您确实有一个循环引用。您可以进一步修改代码以捕获循环引用:

    private void checkAllParents(TreeNode node)
    {
      var parent = node.Parent;
      var visitedNodes = new List<TreeNode>();
      while (parent != null)
      {
        if (visitedNodes.Contains(parent))
          throw new InvalidOperationException("Circular reference!");
        visitedNodes.Add(parent);
        parent.Checked = true;
        parent = parent.Parent;
      }
    }
    

    当然,这不是处理循环引用的正确位置。但如果有帮助的话。。

        3
  •  0
  •   Coding Flow    16 年前

    推荐文章