前提:每个node有唯一标识的东东,我的示例中展现的是文件夹,每个tooltip是文件/文件夹的路径。不同的唯一标识的话,把关于tooltip的相关方面更改即可
private List<string>_listVisibleNodes = new List<string>();
private string_lastSelectedNodePath = string.Empty;
/// <summary>
/// 保存当前树的展现
/// </summary>
private void GetTreeNodesStatus(TreeNodeCollection nodes)
{
foreach (TreeNode node in nodes)
{
if (node.IsExpanded && (!this._listVisibleNodes.Contains(node.ToolTipText)))
{
this._listVisibleNodes.Add(node.ToolTipText);
}
else if((!node.IsExpanded)&&this._listVisibleNodes.Contains(node.ToolTipText))
{
this._listVisibleNodes.Remove(node.ToolTipText);
}
if (node.IsSelected)
{
this._lastSelectedNodePath = node.FullPath;
}
GetTreeNodesStatus(node.Nodes);
}
}
/// <summary>
/// 恢复原来的状态
/// </summary>
private void SetTreeNodesStatus(TreeNodeCollection nodes)
{
foreach (TreeNode node in nodes)
{
if (this._listVisibleNodes.Contains(node.ToolTipText)&&!node.IsExpanded)
{
node.Expand();
}
if (node.ToolTipText == this._lastSelectedNodePath)
{
this.tvProject.SelectedNode = node;
}
SetTreeNodesStatus(node.Nodes);
}
}
/// <summary>
/// 刷新树,调用
/// </summary>
public void RefreshTree()
{
GetTreeNodesStatus(this.tvProject.Nodes);
this.tvProject.Nodes.Clear();//清除之前的内容
//
//添加节点
//
SetTreeNodesStatus(this.tvProject.Nodes);
}
}