レベル指定の Data を TreeView に登録


    string[]    Data=
    { "1 鈴木", "1 慎吾", "1 和子", "2 あゆみ", "2 優子", "3 まい", "0 " };

string で定義したレベル指定の Data を TreeView に登録します。

前田稔の超初心者のプログラム入門

ArrayList を使う

  1. 今回は string で定義したレベル指定の Data を ArrayList を利用して TreeView に登録します。
    ArrayList は配列で手に余るとき役に立つ便利なツールです。
    ArrayList の使用例として参照して下さい。
    空のプロジェクトから TreeView を設定して下さい。
    プロジェクトの作成は TreeView に登録する を参照して下さい。
  2. ArrayList を使うので using で System.Collections を定義します。
    Data が TreeView に登録するデータで Idx がそのインデックスです。
    using System.Collections;   // ArrayList
    
    public class MyForm : Form
    {
        private TreeView treeView1;
        string[]    Data=
        { "1 鈴木", "1 慎吾", "1 和子", "2 あゆみ", "2 優子", "3 まい", "0 " };
        int         Idx; 
    
  3. MyForm() でシステムがロードされるときに一度だけ呼び出される MyForm_Load() 関数を登録します。
        public MyForm()
        {
            InitializeComponent();
            Load += new System.EventHandler(MyForm_Load);
        }
    
  4. InitializeComponent() で TreeView を設定して下さい。
        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.ClientSize = new System.Drawing.Size(278, 245);
            this.Controls.Add(this.treeView1);
            this.Name = "MyForm";
            this.ResumeLayout(false);
        }
    
  5. MyForm_Load() 関数で NodeRoot をパラメータにして Set_TVFunc() 関数を呼び出します。
    '1' は Data に登録されている先頭のレベルです。
    treeView1 を TreeNode にキャストできたら便利なのですが、エラーになるので NodeRoot を渡しています。
    関数から戻ると、TreeView に NodeRoot を登録して TopNode を展開します。
        private void MyForm_Load(object sender, System.EventArgs e)
        {   TreeNode NodeRoot = new TreeNode("Root");
            treeView1.Nodes.Clear();
            Idx = 0;
            Set_TVFunc(NodeRoot, '1');
            treeView1.Nodes.Add(NodeRoot);
            treeView1.TopNode.Expand();
        }
    
  6. Data を TreeNode node を親として登録する Set_TVFunc() 関数です。
    Set_Array() 関数で連続する同一レベル(lev)のデータを aray に取得して node に登録します。
    Set_Array() から戻った時 Idx はレベルが変わった Data の番号を指しています。
    Data[Idx][0] で次のレベルを key に取得します。
    key が '0'(データの終わり)のとき登録が完了です。
    '0' で無い時、最後に登録した TreeNode を親として Set_TVFunc() を再帰で呼び出します。
        // TreeView に登録する再帰関数
        private void Set_TVFunc(TreeNode node, char lev)
        {
            ArrayList aray = new ArrayList();
            char key;
            aray = Set_Array(lev);
            foreach (TreeNode DAT in aray)
            { node.Nodes.Add(DAT); }
            key = Data[Idx][0];
            if (key == '0') return;
            Set_TVFunc(node.LastNode, key);
        }
    
  7. lev と同じレベルの Data を ArrayList に登録する Set_Array() 関数です。
    Data[Idx][0]; を調べて lev と異なるとき return します。
    Data[Idx] を ArrayList に登録して、次の Data を調べます。
        // 同一レベルのノードを ArrayList に登録
        private ArrayList Set_Array(char lev)
        {
            ArrayList array = new ArrayList();
            char    key;
            while(true)
            {   key = Data[Idx][0];
    //Console.WriteLine("lev=" + lev + "  Idx=" + Idx + "  key=" + key);
                if (key != lev) break;
                array.Add(new TreeNode(Data[Idx]));
                Idx++;
            }
            return array;
        }
    

Best Source

  1. ArrayList で同一レベルの node をまとめた方が解り易いかと紹介したのですが、 実はこのプログラムは ArrayList を使わずにもっとシンプルに作成することが出来ます。
    Set_Array() 関数は不要なので削除して下さい。
    Set_TVFunc() 関数を次のように修正して下さい。
    これだけで同じ処理が行えるのですが、ソースコードは簡単でも制御の流れは解り難いでしょうか。
    レベル番号が変わったときは key を新しいレベルにして Set_TVFunc(node.LastNode, key) で再帰的に呼び出します。
    node を親として Data で定義された全てのデータを登録します。
        // TreeView に登録する再帰関数
        private void Set_TVFunc(TreeNode node, char lev)
        {
            char key;
            key = Data[Idx][0];
            if (key == '0') return;
            if (key == lev)
            {
                node.Nodes.Add(new TreeNode(Data[Idx]));
                Idx++;
                Set_TVFunc(node, lev);
                return;
            }
            Set_TVFunc(node.LastNode, key);
        }
    

[Next Chapter ↓] Struct を TreeView に登録
[Previous Chapter ↑] TreeView に階層で登録

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