写代码时需要一个treeview遍历查找节点的方法,在网上找了半天,基本上都是讲treeview遍历查找节点的理论(递归法,非递归法),于是自已写一个treeview遍历查找节点的方法类,特与大家分享!请各位多提点宝贵意见,谢谢了!
treeview遍历查找节点的方法类功能:
1。查找treeview中的某个节点,从前后两个方向查找!
2。从指定节点开始,查找treeview中的某个节点,从前后两个方向查找!
源代码:
view plaincopy to clipboardprint?
//判断是否是要查找的节点 -- 委托
public delegate bool ValidTreeNodeDelegate(TreeNode treeNode);
//
public class ClsFindTreeNodeOfTreeView
{
enum Direction{prev,next};
private TreeView _TreeView;
private bool isFoundStartTreeNode;
public ClsFindTreeNodeOfTreeView(TreeView treeView)
{
_TreeView = treeView;
isFoundStartTreeNode = false;
}
/// <summary>
/// 查找下一个节点
/// </summary>
/// <param name="_ValidTreeNodeDelegate">判断是否是需要的节点的委托</param>
/// <returns></returns>
public bool FindNextNode(ValidTreeNodeDelegate _ValidTreeNodeDelegate)
{
return FindNode(Direction.next, _ValidTreeNodeDelegate,null);
}
/// <summary>
/// 查找下一个节点
/// </summary>
/// <param name="treeNode">开始结点</param>
/// <param name="_ValidTreeNodeDelegate">判断是否是需要的节点的委托</param>
/// <returns></returns>
public bool FindNextNode(TreeNode treeNode, ValidTreeNodeDelegate _ValidTreeNodeDelegate)
{
return FindNode(Direction.next, _ValidTreeNodeDelegate, treeNode);
}
/// <summary>
/// 查找上一个节点
/// </summary>
/// <param name="_ValidTreeNodeDelegate">判断是否是需要的节点的委托</param>
/// <returns></returns>
public bool FindPrevNode(ValidTreeNodeDelegate _ValidTreeNodeDelegate)
{
return FindNode(Direction.prev, _ValidTreeNodeDelegate, null);
}
/// <summary>
/// 查找上一个节点
/// </summary>
/// <param name="treeNode">开始结点</param>
/// <param name="_ValidTreeNodeDelegate">判断是否是需要的节点的委托</param>
/// <returns></returns>
public bool FindPrevNode(TreeNode treeNode, ValidTreeNodeDelegate _ValidTreeNodeDelegate)
{
return FindNode(Direction.prev, _ValidTreeNodeDelegate, treeNode);
}
#region FindNode
private bool FindNode(Direction _Direction, ValidTreeNodeDelegate _ValidTreeNodeDelegate, TreeNode startTreeNode)
{
bool isFound = false;
if (_Direction == Direction.next)
{
for (int i = 0; i < _TreeView.Nodes.Count; i++)
{
if (startTreeNode==null||isFoundStartTreeNode)
{
isFound = _ValidTreeNodeDelegate(_TreeView.Nodes[i]);
if (isFound) break;
}
else
{
//找到开始结点
if (_TreeView.Nodes[i] == startTreeNode)
{
isFoundStartTreeNode = true;
}
}
isFound = FindNode(_TreeView.Nodes[i], _Direction, _ValidTreeNodeDelegate, startTreeNode);
if (isFound) break;
}
}
else
{
for (int i = _TreeView.Nodes.Count - 1; i >= 0; i++)
{
if (startTreeNode == null || isFoundStartTreeNode)
{
isFound = _ValidTreeNodeDelegate(_TreeView.Nodes[i]);
if (isFound) break;
}
else
{
//找到开始结点
if (_TreeView.Nodes[i] == startTreeNode)
{
isFoundStartTreeNode = true;
}
}
isFound = FindNode(_TreeView.Nodes[i], _Direction, _ValidTreeNodeDelegate, startTreeNode);
if (isFound) break;
}
}
return isFound;
}
private bool FindNode(TreeNode treeNode, Direction _Direction, ValidTreeNodeDelegate _ValidTreeNodeDelegate, TreeNode startTreeNode)
{
bool isFound = false;
if (_Direction == Direction.next)
{
for (int i = 0; i < treeNode.Nodes.Count; i++)
{
if (startTreeNode == null || isFoundStartTreeNode)
{
isFound = _ValidTreeNodeDelegate(treeNode.Nodes[i]);
if (isFound) break;
}
else
{
//找到开始结点
if (treeNode.Nodes[i] == startTreeNode)
{
isFoundStartTreeNode = true;
}
}
isFound = FindNode(treeNode.Nodes[i], _Direction, _ValidTreeNodeDelegate, startTreeNode);
if (isFound) break;
}
}
else
{
for (int i = treeNode.Nodes.Count - 1; i >= 0; i++)
{
if (startTreeNode == null || isFoundStartTreeNode)
{
isFound = _ValidTreeNodeDelegate(treeNode.Nodes[i]);
if (isFound) break;
}
else
{
//找到开始结点
if (treeNode.Nodes[i] == startTreeNode)
{
isFoundStartTreeNode = true;
}
}
isFound = FindNode(treeNode.Nodes[i], _Direction, _ValidTreeNodeDelegate, startTreeNode);
if (isFound) break;
}
}
return isFound;
}
#endregion
}