转自http://tb.blog.csdn.net/TrackBack.aspx?PostId=642736
TreeView查找某一节点,通常有两种方法,一种是递归的,一种不是递归,但都是深度优先算法。其中,非递归方法效率高些,而递归算法要简洁一些。

第一种,递归算法,代码如下:
 private TreeNode FindNode( TreeNode tnParent, string strValue )
 {
 if( tnParent == null ) return null;
 if( tnParent.Text == strValue ) return tnParent;
 TreeNode tnRet = null;
 foreach( TreeNode tn in tnParent.Nodes )
 {
 tnRet = FindNode( tn, strValue );
 if( tnRet != null ) break;
 }
 return tnRet;
 }

第二种,非递归算法,代码如下:
 private TreeNode FindNode( TreeNode tnParent, string strValue )
 {
 if( tnParent == null ) return null;
 if( tnParent.Text == strValue ) return tnParent;
 else if( tnParent.Nodes.Count == 0 ) return null;
 TreeNode tnCurrent, tnCurrentPar;
 //Init node
 tnCurrentPar = tnParent;
 tnCurrent = tnCurrentPar.FirstNode;
 while( tnCurrent != null && tnCurrent != tnParent )
 {
 while( tnCurrent != null )
 {
 if( tnCurrent.Text == strValue ) return tnCurrent;
 else if( tnCurrent.Nodes.Count > 0 ) 
 {
 //Go into the deepest node in current sub-path
 tnCurrentPar = tnCurrent;
 tnCurrent = tnCurrent.FirstNode;
 }
 else if( tnCurrent != tnCurrentPar.LastNode )
 {
 //Goto next sible node 
 tnCurrent = tnCurrent.NextNode;
 }
 else
 break;
 }
 
 //Go back to parent node till its has next sible node
 while( tnCurrent != tnParent && tnCurrent == tnCurrentPar.LastNode )
 {
 tnCurrent = tnCurrentPar;
 tnCurrentPar = tnCurrentPar.Parent;
 }
 //Goto next sible node
 if( tnCurrent != tnParent )
 tnCurrent = tnCurrent.NextNode;
 }
 return null;
 }

 程序调用,如下:
 TreeNode tnRet = null;
 foreach( TreeNode tn in yourTreeView.Nodes )
 {
 tnRet = FindNode( tn, yourValue );
 if( tnRet != null ) break;
 }
posted on 2010-10-13 14:18  Jessica Lu  阅读(317)  评论(0)    收藏  举报