C#中遍历TreeView的两个常用方法

  1. 在TreeView查找某一节点,通常有两种方法,一种是递归的,一种不是递归,但都是深度优先算法。其中,非递归方法效率高些,而递归算法要简洁一些。
  2. 第一种,递归算法,代码如下:
  3.     
  4. private TreeNode FindNode( TreeNode tnParent, string strValue )
  5.     {
  6.         if( tnParent == null ) return null;
  7.         if( tnParent.Text == strValue ) return tnParent;
  8.         TreeNode tnRet = null;
  9.         foreach( TreeNode tn in tnParent.Nodes )
  10.         {
  11.             tnRet = FindNode( tn, strValue );
  12.             if( tnRet != null ) break;
  13.         }
  14.         return tnRet;
  15.     }
  16. 第二种,非递归算法,代码如下:
  17.     
  18. private TreeNode FindNode( TreeNode  tnParent, string strValue )
  19.     {
  20.         if( tnParent == null ) return null;
  21.         if( tnParent.Text == strValue ) return tnParent;
  22.         else if( tnParent.Nodes.Count == 0 ) return null;
  23.         TreeNode tnCurrent, tnCurrentPar;
  24.         //Init node
  25.         tnCurrentPar = tnParent;
  26.         tnCurrent = tnCurrentPar.FirstNode;
  27.         while( tnCurrent != null && tnCurrent != tnParent )
  28.         {
  29.             while( tnCurrent != null )
  30.             {
  31.                 if( tnCurrent.Text == strValue ) return tnCurrent;
  32.                 else if( tnCurrent.Nodes.Count > 0 )
  33.                 {
  34.                     //Go into the deepest node in current sub-path
  35.                     tnCurrentPar = tnCurrent;
  36.                     tnCurrent = tnCurrent.FirstNode;
  37.                 }
  38.                 else if( tnCurrent != tnCurrentPar.LastNode )
  39.                 {
  40.                     //Goto next sible node
  41.                     tnCurrent = tnCurrent.NextNode;
  42.                 }
  43.                 else
  44.                     break;
  45.             }
  46.                
  47.             //Go back to parent node till its has next sible node
  48.             while( tnCurrent != tnParent && tnCurrent == tnCurrentPar.LastNode )
  49.             {
  50.                 tnCurrent = tnCurrentPar;
  51.                 tnCurrentPar = tnCurrentPar.Parent;
  52.             }
  53.             //Goto next sible node
  54.             if( tnCurrent != tnParent )
  55.                 tnCurrent = tnCurrent.NextNode;
  56.         }
  57.         return null;
  58.     }
  59.        程序调用,如下:
  60.        
  61.  TreeNode tnRet = null;
  62.         foreach( TreeNode tn in yourTreeView.Nodes )
  63.         {
  64.             tnRet =  FindNode( tn, yourValue );
  65.             if( tnRet != null ) break;
  66.         }
 

你可能感兴趣的:(C#编程资料)