子・孫を再起でトレース

トップ\鈴木
0: 鈴木
1: 慎吾
2: あゆみ
2: 優子
1: 和子
------------
トップ\鈴木\慎吾
0: 慎吾
1: あゆみ
1: 優子
------------
トップ\佐藤
0: 佐藤
1: エリザベス
------------
TreeView でクリックされたノードの子・孫を再起でトレースします。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. TreeView のノードを左クリックすると、下位のノード(子・孫)を再起でトレースします。
    プログラムは Command Line からコンパイル出来る形式で掲載します。
    実行の方法は Command Line から Windows プログラムを実行 を参照して下さい。
    ソースプログラム TreeChild.cs です。
    /*★ クリックされたノードの子・孫を再起でトレース    前田 稔 ★*/
    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    public class MyForm : Form
    {
        private TreeView treeView1;
        public MyForm()
        {
            InitializeComponent();
            Load += new System.EventHandler(MyForm_Load);
        }
    
        private void InitializeComponent()
        {
            this.treeView1 = new System.Windows.Forms.TreeView();
            this.SuspendLayout();
     
            this.treeView1.Location = new System.Drawing.Point(12, 12);
            this.treeView1.Name = "treeView1";
            this.treeView1.Size = new System.Drawing.Size(254, 221);
            this.treeView1.TabIndex = 0;
            this.treeView1.AfterSelect +=
                new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect);
    
            this.ClientSize = new System.Drawing.Size(278, 245);
            this.Controls.Add(this.treeView1);
            this.Name = "MyForm";
            this.ResumeLayout(false);
        }
    
        private void MyForm_Load(object sender, System.EventArgs e)
        {
            TreeNode Top = new TreeNode("トップ");
            TreeNode Suzuki = new TreeNode("鈴木");
            TreeNode Singo= new TreeNode("慎吾");
            Singo.Nodes.Add(new TreeNode("あゆみ"));
            Singo.Nodes.Add(new TreeNode("優子"));
            Suzuki.Nodes.Add(Singo);
            Suzuki.Nodes.Add(new TreeNode("和子"));
            TreeNode Tanaka = new TreeNode("田中");
            Tanaka.Nodes.Add(new TreeNode("ヘンリー"));
            TreeNode Sato = new TreeNode("佐藤");
            Sato.Nodes.Add(new TreeNode("エリザベス"));
            Top.Nodes.Add(Suzuki);
            Top.Nodes.Add(Tanaka);
            Top.Nodes.Add(Sato);
            treeView1.Nodes.Add(Top);
            treeView1.TopNode.ExpandAll();  //Node を展開
        }
    
        // ノードの左クリックを検出
        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            TreeNode selectedNode = e.Node;
            Console.WriteLine(selectedNode.FullPath);
            Trace(selectedNode, 0);     //子・孫を再起でトレース
            Console.WriteLine("------------");
        }
    
        // ノードの子・孫を再起でトレース
        void Trace(TreeNode node, int lev)
        {
            TreeNode child = new TreeNode();
            if (node==null)     return;
            if (lev>5)          return;
            Console.WriteLine(lev + ": " + node.Text);
            child = node.FirstNode;
            if (child==null)    return;
            Trace(child, lev+1);
            child = child.NextNode;
            Trace(child, lev+1);
        }
    }
    
    class form01
    {   public static void Main()
        {   MyForm mf = new MyForm();
            Application.Run(mf);
        }
    }
    
  2. 再起レベルをテストするために「鈴木, 田中, 佐藤」の上に「トップ」を設定しています。
    ノードの左クリックを検出するときは AfterSelect を使います。
            this.treeView1.AfterSelect +=
                new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect);
    
  3. クリックされたノードをフルパスで印字して Trace(selectedNode, 0); を呼び出します。
    0 は再起のレベルです。
            Console.WriteLine(selectedNode.FullPath);
            Trace(selectedNode, 0);     //子・孫を再起でトレース
    
  4. 再起で TreeView をトレースする Trace() メソッドです。
    node==null のとき、再起呼び出しの終了です。
    if (lev>5) は、本来不必要なのですが、再起のループにはまったときのストッパーです。
            if (node==null)     return;
            if (lev>5)          return;
    
    渡されたノードの名前を印字して、node.FirstNode; で先頭の子ノードを取得します。
    子ノードが存在するとき Trace(child, lev+1); で再帰的に呼び出します。
    先頭の子ノードに続き、兄弟ノードを呼び出します。
            Console.WriteLine(lev + ": " + node.Text);
            child = node.FirstNode;
            if (child==null)    return;
            Trace(child, lev+1);
            child = child.NextNode;
            Trace(child, lev+1);
    
  5. 再起関数は 再起関数の基礎 を参照して下さい。
    Tree 構造の再起関数は Binary Tree ソート を参照して下さい。

超初心者のプログラム入門(C# Frame Work)