こんにちは、ツリービューを更新した後(新しいデータを追加するか、一部を削除して)、ツリービューマップを保存したいことを理解しています。展開されたすべてのノードを展開したいのですが、他のノードはデフォルトで折りたたまれています。解決策は次のとおりです。
1) 更新前に展開されたツリー ビュー ノードを保存する
2) ツリー ビュー データを更新します (ノードを削除する場合は、保存済みリストからも削除することに注意してください)。
3) 以前に保存したツリー ビュー マップを設定する
ツリー ビュー マップの保存 (展開されたノードのみ) -> このコード ツリー ビュー ノード コレクションを参照し、展開されたノード名を文字列リストに保存します。
List<string> collectExpandedNodes(TreeNodeCollection Nodes)
{
List<string> _lst = new List<string>();
foreach (TreeNode checknode in Nodes)
{
if (checknode.IsExpanded)
_lst.Add(checknode.Name);
if (checknode.Nodes.Count > 0)
_lst.AddRange(collectExpandedNodes(checknode.Nodes));
}
return _lst;
}
展開されたノード名をリストに収集し、ツリー ビューの外観を取り戻したい場合は、名前でノードを取得する関数と、選択したノードとその親を展開する関数の 2 つの関数が必要です。
この関数は、ノードがツリー ノード コレクションに存在する場合、選択したノード名へのポインタを取得します。
TreeNode FindNodeByName(TreeNodeCollection NodesCollection , string Name)
{
TreeNode returnNode = null; // Default value to return
foreach (TreeNode checkNode in NodesCollection)
{
if (checkNode.Name == Name) //checks if this node name is correct
returnNode = checkNode;
else if (checkNode.Nodes.Count > 0 ) //node has child
{
returnNode = FindNodeByName(checkNode.Nodes , Name);
}
if (returnNode != null) //check if founded do not continue and break
{
return returnNode;
}
}
//not found
return returnNode;
}
およびこの関数展開ノードとその親
void expandNodePath(TreeNode node)
{
if (node == null)
return;
if (node.Level != 0) //check if it is not root
{
node.Expand();
expandNodePath(node.Parent);
}
else
{
node.Expand(); // this is root
}
}
以下は、関数の使用法を示しています
private void button4_Click(object sender, EventArgs e)
{
//saving expanded nodes
List<string> ExpandedNodes = new List<string>();
ExpandedNodes = collectExpandedNodes(treeView1.Nodes);
//resetting tree view nodes status to colapsed
treeView1.CollapseAll();
//Restore it back
if (ExpandedNodes.Count > 0)
{
TreeNode IamExpandedNode;
for (int i = 0; i < ExpandedNodes.Count;i++ )
{
IamExpandedNode = FindNodeByName(treeView1.Nodes, ExpandedNodes[i]);
expandNodePath(IamExpandedNode);
}
}
}