关于NextGrid控件和cxTreeList控件中的子节点问题(未完待续)

来源:互联网 发布:jre 7u9 windows 64 编辑:程序博客网 时间:2024/06/04 19:00

关于NextGrid控件和cxTreeList控件中的子节点问题

本文来自http://blog.csdn.net/jqandjq ,引用必须注明出处

本文章主要讨论NextSuit控件套件中的NextGrid控件和Express控件套件中的cxTreeList控件中关于子节点使用的不同点,以及转换方式,并着重于NextGridcxTreeList控件的转换。

NextGridcxTreeList对于子节点的管理方式是有很大的不同的,NextGrid作为一个GRID,它是一个比较整体的部分,一个列的所有行可以看成是整体。cxTreeList作为TreeList它更看重于对TREE的管理,他用的便是以结点的方式,每一个行可以看作是一个节点用cxTreeList的表达是一个ITEM项。

对于子节点的插入,NextGrid用的是直接插入方式,如:NextGrid1.AddChildRow(n);其中nGrid的位置,即插入的是在Gridn-1行节点的孩子。再看cxTreeList,用的是对某个节点进行操作的方式,即:cxTreeList1.AddChild(cxTreeList1.Items[n]);插入的位置便是节点cxTreeList1.Items[n]的子位置,或用:cxTreeList1.Items[n].AddChild,需要注意的是,这里的NNextGridN并不是同一个概念,并不能做简单的替换。因为NextGrid在计算位置的时候直接包含了所有层面上的节点,即包括子节点,而cxTreeList1.Items[n]只是表示第一层的第n个节点。

了解它们大致的结构,我们开始要对它们获取子节点个数的函数展开讨论。NextGrid获取子节点数的方式主要是用NextGrid1.GetChildCount(i),这里的iNextGrid的位置,得到的是这个节点的所有的子节点数,注意,是包含所有的子节点的,包括子节点的子节点。而cxTreeList获得子节点数的方式主要是用cxTreeList1.Items[i].ChildVisibleCountcxTreeList1.Items[i].Count,这里的i也仅表示第一层的节点的位置,得到的结果是该节点的下一级子节点数(不包含下下级)。

现在我们有一个PROJECT用的是NextGrid控件,但由于某种原因,我们需要把他改用成cxTreeList,那么对于子节点的操作应该是最大的改造。比如获取所有的子节点数,我们需要做一个GetChildCount,实现和NextGrid1.GetChildCount(i)同样的功能。

我们遇到的问题是cxTreeList1.Items[i].ChildVisibleCount得到的只是下一级的节点,也就说更深的级我们是看不到的,于是我们或许需要写个深度搜索来解决这个问题。先用深搜来通过i找到这个要找的节点是哪个节,再深搜得到这个节点的子节点个数,还有另一种思想就是计算下一个非子辈节点位置和当前的位置的差,但是会有几种情况出现:

1.       下一个是同级节点

2.       下一个是高级(父辈)节点

3.       下一个是NULL,即没有下一个大于等于该级别的结点

幸运的事,cxTreeList已经帮我们封装了按深度优先搜索顺序得到下一个节点的函数,cxNode := cxNode.GetNext;这减轻了我们的工作量,我们只需要“线性”遍历,而不用递归,因为递归相对来说易出错且难以调试。我们得到第i个节点之后,现在的难点是如何得到这个节点的所有层的子节点。按解题复杂度,我们还是先考虑非递归的方法,按测试先行我们必须要设计出以上三点的三种测试用例。现在我们设计一个找非子辈节点的方式。

Index = node.index;
While(node <> root)
{
    nodeParent := node. Parent;
    node := node. getNextSibling //
找下一个兄弟

    if (node <> nil) //
有下一个兄弟
    {
        NextIndex = node.Index;
        break;
    }
    node := nodeParent; //
没下一个兄弟,去找父亲节点
}
if (node == root)
    NextIndex = cxTreeList.Last. Index + 1;
Result = NextIndex – Index;