TreeView
コントロール内のすべてのツリーノード(すべてのレベル)のリストを取得するにはどうすればよいですか?
ルートノードが1つあるツリーがあるとすると、次のコードは常にツリーノードを最も深いところまでループし、次に1レベル戻ります。各ノードのテキストを印刷します。 (頭のてっぺんからテストされていません)
TreeNode oMainNode = oYourTreeView.Nodes[0];
PrintNodesRecursive(oMainNode);
public void PrintNodesRecursive(TreeNode oParentNode)
{
Console.WriteLine(oParentNode.Text);
// Start recursion on all subnodes.
foreach(TreeNode oSubNode in oParentNode.Nodes)
{
PrintNodesRecursive(oSubNode);
}
}
2つの再帰的拡張メソッドを使用できます。 myTreeView.GetAllNodes()
またはmyTreeNode.GetAllNodes()
のいずれかを呼び出すことができます。
public static List<TreeNode> GetAllNodes(this TreeView _self)
{
List<TreeNode> result = new List<TreeNode>();
foreach (TreeNode child in _self.Nodes)
{
result.AddRange(child.GetAllNodes());
}
return result;
}
public static List<TreeNode> GetAllNodes(this TreeNode _self)
{
List<TreeNode> result = new List<TreeNode>();
result.Add(_self);
foreach (TreeNode child in _self.Nodes)
{
result.AddRange(child.GetAllNodes());
}
return result;
}
次のようなものを探している場合に備えて、怠惰なLINQアプローチ:
private void EnumerateAllNodes()
{
TreeView myTree = ...;
var allNodes = myTree.Nodes
.Cast<TreeNode>()
.SelectMany(GetNodeBranch);
foreach (var treeNode in allNodes)
{
// Do something
}
}
private IEnumerable<TreeNode> GetNodeBranch(TreeNode node)
{
yield return node;
foreach (TreeNode child in node.Nodes)
foreach (var childChild in GetNodeBranch(child))
yield return childChild;
}
Krumelurの回答を更新します(彼/彼女のソリューションの最初の2行をこれに置き換えます):
foreach ( var node in oYourTreeView.Nodes )
{
PrintNodesRecursive( node );
}
ノードキーを一意にする必要がない場合は、すべてのノードキーを空の文字列(_""
_)に設定するだけで、Treeview1.Nodes.Find("", true);
を実行して内のすべてのノードを返すことができます。ツリー表示。
このコードは、現在の深度レベルを識別してすべてのTreeViewリストを反復処理するのに役立ちます。コードを使用して、TreeViewアイテムをXMLファイルやその他の目的に保存できます。
int _level = 0;
TreeNode _currentNode = treeView1.Nodes[0];
do
{
MessageBox.Show(_currentNode.Text + " " + _level);
if (_currentNode.Nodes.Count > 0)
{
_currentNode = _currentNode.Nodes[0];
_level++;
}
else
{
if (_currentNode.NextNode != null)
_currentNode = _currentNode.NextNode;
else
{
_currentNode = _currentNode.Parent.NextNode;
_level--;
}
}
}
while (_level > 0);
TreeViewには多くのレベルがあるため、再帰関数を実行します。
public void AddNodeAndChildNodesToList(TreeNode node)
{
listBox1.Items.Add(node.Text); // Adding current nodename to ListBox
foreach (TreeNode actualNode in node.Nodes)
{
AddNodeAndChildNodesToList(actualNode); // recursive call
}
}
TreeViewのすべての第1レベルノードに対してこの関数を呼び出すよりも:
foreach (TreeNode actualNode in treeView1.Nodes) // Begin with Nodes from TreeView
{
AddNodeAndChildNodesToList(actualNode);
}
コードはサイトからのものです C#TreeView