web-dev-qa-db-ja.com

TreeViewコントロールのすべてのツリーノード(すべてのレベル)のリストを取得します

TreeViewコントロール内のすべてのツリーノード(すべてのレベル)のリストを取得するにはどうすればよいですか?

9
Mahmoud Farahat

ルートノードが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);
  }
}
17
Krumelur

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;
}
23
modiX

次のようなものを探している場合に備えて、怠惰な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;
}
9
Anton Purin

Krumelurの回答を更新します(彼/彼女のソリューションの最初の2行をこれに置き換えます):

foreach ( var node in oYourTreeView.Nodes )
{
    PrintNodesRecursive( node );
}
6
dzendras

ノードキーを一意にする必要がない場合は、すべてのノードキーを空の文字列(_""_)に設定するだけで、Treeview1.Nodes.Find("", true);を実行して内のすべてのノードを返すことができます。ツリー表示。

1
bryan

このコードは、現在の深度レベルを識別してすべての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);
0
undead10

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

0
TreeViewMaster