我要经常进行一项测试,所以自然而然地我想将其放在一种方法中。
在树状视图中,我有两个左右按钮,用于将节点向上移动一层(一层?不确定在此处使用的正确单词)还是向下移动一层。
但是,树状视图中的某些项目只能作为其他特定项目的子项放置。某些项目可以作为子项或作为根节点放置。
因此,我正在构建一个方法,在该方法中我传递子节点和父节点。如果移动成功,则子节点是将成为父节点的子节点的节点。左键单击,意味着父节点实际上是孩子当前父节点的父节点。右键单击,表示父节点当前是子节点的兄弟节点,并将成为其父节点。
我在调用函数时已经知道节点是否是根节点,因此我可以完全添加第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) { }
还有更好的方法吗?
答案 0 :(得分:0)
当您在树中时,判断您是否在树根的唯一真实方法是确保未指定父级。因此,如果您已经跟踪了所在节点的父节点,则引用的if语句是最好的方法。对于该方法,您甚至可以编写一个递归遍历方法,使之沿着树向上移动,直到找到根节点为止(如果您也想这样做)。简单的null检查绝对是执行此操作的最有效方法。
如果您的树中还没有父级跟踪并且不想指定它(或者如果您使用的是外部Tree实现,则不能指定),我建议您将其他方法传入根,然后快速检查您的方法,询问该节点是否与传入的根节点相同。