首页 > 代码库 > C# TreeView控件 展开指定子节点的所有父节点

C# TreeView控件 展开指定子节点的所有父节点

    通常,我们需要的功能更多的是通过展开某一个父节点同时展开所有的子节点(即:联动),但是有时候我们也需要展开某一个节点之上的所有父节点,直到当前节点,例如在删除某一个节点时,不想删除之后所有节点有折叠,这时候就需要这种功能。这样说可能不好理解,也可能是本人语言表达能力欠佳,我们来看一个图:


   通常我们都是点击根节点“1”展开所有的节点,如上。但是现在我们要删除节点“11111”,删除之后是自动展开到“1111”,即:


    注意两个图是不一样的。


    如何实现这种功能?递归

        利用递归关键的是找出要删除节点的父节点(假如是C),找到父节点C之后继续利用递归找出C的父节点B,找到父节点B之后继续找出B的父节点A.... .... 还需要加一个判断,判断一下 父节点.Parent.Parent  看部分代码:

 string parentName="";
private void 删除选中节点ToolStripMenuItem_Click(object sender, EventArgs e)
{
	try
	{
		TreeNode node = treeView1.SelectedNode.Parent;
		if (ChuLi.deleteNode(NodeId))//这个是我自己定义的方法,大家可以忽略
		{
			if (node != null)//如果是子节点不是根节点,那么就展开
			{
				parentName = node.Text;
				//展开的应该是父节点
				ExpandNodes(treeView1.Nodes);//调用-----------------------------------------
			}
		}
		else
		{
			MessageBox.Show("删除失败!");
		}
	}
	catch (Exception ex)
	{
		MessageBox.Show(ex.Message);
	}
}

//遍历所有节点,找出指定节点
private void ExpandNodes(TreeNodeCollection tnodes)
{
	foreach (TreeNode node in tnodes)
	{
		if (node.Text == parentname)//比较判断,所以需要知道所选节点的父节点名字:node.Parent.Text
		{
			ExpandParentNodes(node.Parent.Nodes);//调用下一个递归方法
		}
		ExpandNodes(node.Nodes);
	}
}

//关键点所在
private void ExpandParentNodes(TreeNodeCollection tnodes)
{
	TreeNode parentNode;
	foreach (TreeNode node in tnodes)
	{
		parentNode = node;
		if (parentNode.Parent != null)
		{
			parentNode.Parent.Expand();
			if (parentNode.Parent.Parent != null)//判断父节点的父节点是否为空,如果已经达到根节点就是null
			{
				ExpandParentNodes(parentNode.Parent.Parent.Nodes);
			}
			else
				break;//已经达到根节点,退出
		}
	}
}

    以上代码就可以实现展开指定子节点的所有父节点了。

    时间仓促加上技术能力有限,不足之处还望大大们斧正!


知识就是用来分享,但是转载请注明出处!谢谢合作!