none
treeview节点查找? RRS feed

  • 问题

  • 我想在WINFORM中的treeview中做一个节点查找,类似记事本中可以“查找下一个“的那样,但是每次只能找到第一个,不能往下遍历查找,请大家帮帮忙?
    2009年5月14日 12:53

答案

  • 如果要实现类似“查找下一个的功能”,最少有以下两种方法:
    1、维护一个列表,用于保存已搜索到的项,每次都从根节点开始搜索,找到匹配项时,先判断项是否在列表中,是则继续继续查找,否则返回该项。
    2、每次找到一个匹配项好,记录该项位置,下次搜索时,从记录的位置开始搜索。如果能够定义一个固定的搜索顺序,则不会找到重复的结果。

    不知道我对你的问题的理解是否正确。
    如果确实是这个问题,你应该描述一下你的实现方式。
    2009年5月15日 3:07

全部回复

  • 你好!
         请问可以提供你的相关代码吗?
    周雪峰
    2009年5月14日 13:29
    版主
  • 定义一个arraylist,将搜索到的节点存入。
    每次搜到符合定义的节点时,判断节点是否在arraylist里。
    如果在arraylist,则继续查找。
    2009年5月14日 23:06
  • 如果要实现类似“查找下一个的功能”,最少有以下两种方法:
    1、维护一个列表,用于保存已搜索到的项,每次都从根节点开始搜索,找到匹配项时,先判断项是否在列表中,是则继续继续查找,否则返回该项。
    2、每次找到一个匹配项好,记录该项位置,下次搜索时,从记录的位置开始搜索。如果能够定义一个固定的搜索顺序,则不会找到重复的结果。

    不知道我对你的问题的理解是否正确。
    如果确实是这个问题,你应该描述一下你的实现方式。
    2009年5月15日 3:07
  • 泉子兄,说的很对,按照你说的方法2怎么实现,我有代码帮我改下,谢谢
    demo
    http://www.cnxinshe.com./treesearch.rar

    方法
    http://blog.csdn.net/zx13525079024/archive/2009/05/16/4191269.aspx

    msn:2008xiangzhang@live.cn
    2009年5月18日 14:46
  • 这位同学,你写了FindNextNode、FindPrevNode等函数,可是我看不出来你是怎么是到查找结果的。

    我写了一个函数如下:
            /// <summary>
            /// 查找下一个节点
            /// </summary>
            /// <param name="direction">查找方向</param>
            /// <param name="startNode">起始结点</param>
            /// <param name="match">匹配委托</param>
            /// <returns>返回找到的下一个节点,若未找到,则返回null</returns>
            public TreeNode FindNextNode(Direction direction, TreeNode startNode, Predicate<TreeNode> match)
            {
    
                int StartIdx;                               //搜索起始位置的索引
                int BoundaryIdx;                            //边界索引
                int Step = 0;                               //步进值
    
                //初始化搜索范围
                if (direction == Direction.next)
                {
                    StartIdx = -1;
                    BoundaryIdx = _TreeView.Nodes.Count;
                    Step = 1;
                }
                else
                {
                    StartIdx = _TreeView.Nodes.Count;
                    BoundaryIdx = -1;
                    Step = -1;
                }
    
                //查找起始节点
                if (startNode != null)
                {
                    for (int idx = 0; idx < _TreeView.Nodes.Count; ++idx)
                    {
                        if (_TreeView.Nodes[idx] == startNode)
                        {
                            StartIdx = idx;
                            break;
                        }
                    }
                }
    
                //搜索一下个节点
                for (int idx = StartIdx + Step; idx != BoundaryIdx; idx+=Step)
                {
                    if (match(_TreeView.Nodes[idx])) return _TreeView.Nodes[idx];
                }
                return null;
            }

    不怎么是否能满足你的要求。

    有一点要说明的是,TreeView.Nodes不会包含树中所有节点,此集合仅包含其中的根节点。如果是要在TreeView中所有节点中进行查找,则需要使用类似于树遍历的算法的来查找。



    • 已编辑 泉子 2009年5月20日 1:00
    2009年5月20日 0:57