本篇提供遍历TreeView的方法
一 归根结底就是用递归跟树TreeView的初始化是类似的
1 TreeNodeCollection 做参数(这个是找一个checked node,可以替换以相应的处理)
调用时用:Check(treeMenu.Nodes);// treeMenu.Nodes 就只是一个根节点
/// <summary>
/// 遍历TreeView 这里不能用TreeView做参数(无法递归TreeNode不能转换成TreeView),只能用 根节点后在是 节点集合
/// </summary>
/// <param name="tvtemp">节点集 书的nodes集就是它的根节点</param>
protected void Check(TreeNodeCollection tvtemp)
{
foreach (TreeNode temp in tvtemp)
{
if (temp.Checked == true)
{
temp.Checked = false;
break;
}
if (temp.ChildNodes.Count != 0)//如果是iewc:treeview直接写temp.Nodes
{
Check(temp.ChildNodes);
}
}
}
/// 遍历TreeView 这里不能用TreeView做参数(无法递归TreeNode不能转换成TreeView),只能用 根节点后在是 节点集合
/// </summary>
/// <param name="tvtemp">节点集 书的nodes集就是它的根节点</param>
protected void Check(TreeNodeCollection tvtemp)
{
foreach (TreeNode temp in tvtemp)
{
if (temp.Checked == true)
{
temp.Checked = false;
break;
}
if (temp.ChildNodes.Count != 0)//如果是iewc:treeview直接写temp.Nodes
{
Check(temp.ChildNodes);
}
}
}
2 根节点做参数
protected void AllCheck(TreeNode root)
{
if (root.ChildNodes.Count != 0)
foreach (TreeNode temp in root.ChildNodes)
{
if (temp.Checked == true)
{
//do what you want
}
if (temp.ChildNodes.Count != 0)
{
AllCheck(temp.ChildNodes);
}
}
}
{
if (root.ChildNodes.Count != 0)
foreach (TreeNode temp in root.ChildNodes)
{
if (temp.Checked == true)
{
//do what you want
}
if (temp.ChildNodes.Count != 0)
{
AllCheck(temp.ChildNodes);
}
}
}
二 使用栈遍历TreeView
/// <summary>
/// 非递归后序遍历二叉树
/// =Color.Red 表示从右进入
/// =Color.Lavender表示从左进入
/// ==Color.Red 表示从右回来
/// </summary>
/// <param name="tn">当前子树的根</param>
/// <param name="lv">保存结果的列表</param>
private void PreTraWithoutRecurtion(TreeNode tn, ListBox lv)
{
Stack stack = new Stack();
{
lv.Items.Add(tn.Text);
stack.Push(tn);
tn = tn.ChildNodes[0];
}
lv.Items.Add(tn.Text);
while (stack.Count != 0)
{
TreeNode tn1 = (TreeNode)stack.Pop();
//if (tn.ChildNodes.Count > 1)
//{
for (int i = 1; i < tn1.ChildNodes.Count; i++)
{
tn = tn1.ChildNodes[i];
while (tn.ChildNodes.Count != 0)
{
lv.Items.Add(tn.Text);
stack.Push(tn);
tn = tn.ChildNodes[0];
}
lv.Items.Add(tn.Text);
}
//}
}
{
lv.Items.Add(tn.Text);
Stack stack = new Stack();
for (int i = 0; i < tn.ChildNodes.Count; i++)
{
if (tn.ChildNodes[i].ChildNodes.Count > 0)
{
stack.Push(tn.ChildNodes[i]);
}
lv.Items.Add(tn.ChildNodes[i].Text);
}
while (stack.Count > 0)
{
TreeNode outTn = (TreeNode)stack.Pop();
for (int i = 0; i < outTn.ChildNodes.Count; i++)
{
if (outTn.ChildNodes[i].ChildNodes.Count > 0)
{
stack.Push(outTn.ChildNodes[i]);
}
lv.Items.Add(outTn.ChildNodes[i].Text);
}
}
}
/// 非递归后序遍历二叉树
/// =Color.Red 表示从右进入
/// =Color.Lavender表示从左进入
/// ==Color.Red 表示从右回来
/// </summary>
/// <param name="tn">当前子树的根</param>
/// <param name="lv">保存结果的列表</param>
private void PreTraWithoutRecurtion(TreeNode tn, ListBox lv)
{
Stack stack = new Stack();
while (tn.ChildNodes.Count != 0)
{
lv.Items.Add(tn.Text);
stack.Push(tn);
tn = tn.ChildNodes[0];
}
lv.Items.Add(tn.Text);
while (stack.Count != 0)
{
TreeNode tn1 = (TreeNode)stack.Pop();
//if (tn.ChildNodes.Count > 1)
//{
for (int i = 1; i < tn1.ChildNodes.Count; i++)
{
tn = tn1.ChildNodes[i];
while (tn.ChildNodes.Count != 0)
{
lv.Items.Add(tn.Text);
stack.Push(tn);
tn = tn.ChildNodes[0];
}
lv.Items.Add(tn.Text);
}
//}
}
}
{
lv.Items.Add(tn.Text);
Stack stack = new Stack();
for (int i = 0; i < tn.ChildNodes.Count; i++)
{
if (tn.ChildNodes[i].ChildNodes.Count > 0)
{
stack.Push(tn.ChildNodes[i]);
}
lv.Items.Add(tn.ChildNodes[i].Text);
}
while (stack.Count > 0)
{
TreeNode outTn = (TreeNode)stack.Pop();
for (int i = 0; i < outTn.ChildNodes.Count; i++)
{
if (outTn.ChildNodes[i].ChildNodes.Count > 0)
{
stack.Push(outTn.ChildNodes[i]);
}
lv.Items.Add(outTn.ChildNodes[i].Text);
}
}
}