如何判断给定节点是否在根上

时间:2019-04-05 16:04:05

标签: c# treeview nodes

我要经常进行一项测试,所以自然而然地我想将其放在一种方法中。

在树状视图中,我有两个左右按钮,用于将节点向上移动一层(一层?不确定在此处使用的正确单词)还是向下移动一层。

但是,树状视图中的某些项目只能作为其他特定项目的子项放置。某些项目可以作为子项或作为根节点放置。

因此,我正在构建一个方法,在该方法中我传递子节点和父节点。如果移动成功,则子节点是将成为父节点的子节点的节点。左键单击,意味着父节点实际上是孩子当前父节点的父节点。右键单击,表示父节点当前是子节点的兄弟节点,并将成为其父节点。

我在调用函数时已经知道节点是否是根节点,因此我可以完全添加第3个参数来识别该节点...但是,如果已经有一种简单的方法来解决这个问题,为什么还要增加额外的复杂性我不知道我用整个树形图弄清楚了,但是在这里我试图只用节点来做。也许这很糟糕,我完全愿意接受并更改它。

我使用标签存储整个对象,但是我在imageindex中为树节点提供了自己的图像,并且正在使用该imageindex来确定要处理的节点类型。因此,现在我有:

private bool TestNodeMovement(TreeNode child, TreeNode parent)
{
  bool returnValue = false;
  switch(child.ImageIndex)
  {
    case 0:
    case 1:
      if ((parent.ImageIndex == 2 && parent.ImageIndex == 4) {
        returnValue = true;
      }
      break;
    case 2:
    case 4:
      if ((parent.ImageIndex == 0 && parent.ImageIndex == 1) {
        returnValue = true;
      }
      break;
    default: //all other tree movement types are accepted
      returnValue = true;
      break;
  }
  return returnValue;
}

第一个-0和1-这些值也可以在根目录下...所以我需要在其中进行测试,以查看parent是否是根对象。

我想我可以做

if (parent.Parent != null) { }

还有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

当您在树中时,判断您是否在树根的唯一真实方法是确保未指定父级。因此,如果您已经跟踪了所在节点的父节点,则引用的if语句是最好的方法。对于该方法,您甚至可以编写一个递归遍历方法,使之沿着树向上移动,直到找到根节点为止(如果您也想这样做)。简单的null检查绝对是执行此操作的最有效方法。

如果您的树中还没有父级跟踪并且不想指定它(或者如果您使用的是外部Tree实现,则不能指定),我建议您将其他方法传入根,然后快速检查您的方法,询问该节点是否与传入的根节点相同。