## <转>如何C#中实现在TreeView查找某一节点

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 2007-12-26 16:24 西门潇洒 阅读(...) 评论(...) 编辑 收藏

• 随笔 - 77
• 文章 - 0
• 评论 - 91