Expand

TreeView のドライブをクリックするとノードを展開します。

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

プログラムの説明

  1. TreeView にドライブの一覧を表示して、クリックでノードを展開します。
    ドライブの取得は Drive Icon を参照して下さい。
    「Drive Icon」ではダミーノードを使っていますが、今回はサブフォルダーフラグを利用する TreeNodeEx class を使います。
    フラグが ON のときは、展開されていないノードです。
    ノードを展開するときは、1つ下の階層のすべてのノードに対して、子ノードを追加します。
  2. using の設定です。
    参照が不足してエラーが表示されるときは、参照設定を右クリックして追加して下さい。
    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data;
    using System.IO;
    
  3. TreeNodeEx class です。
    isSubFoldersAdded でノードが展開されたことを記録します。
        // サブフォルダーフラグを使った TreeNode
        public class TreeNodeEx : System.Windows.Forms.TreeNode
        {
            private bool isSubFoldersAdded;
    
            public TreeNodeEx(string text) : base(text)
            {   InitializeComponent();  }
    
            private void InitializeComponent()
            {   isSubFoldersAdded = false;  }
    
            public bool SubFoldersAdded
            {
                get
                {   return isSubFoldersAdded;   }
                set
                {   isSubFoldersAdded = value;  }
            }
        } 
        
  4. Form1_Load() でドライブを検索して TreeView に登録します。
    InitializeComponent() 関数で this.Load を設定して下さい。
            private void InitializeComponent()
            {
                ・・・
                this.Load += new System.EventHandler(this.Form1_Load);
                this.ResumeLayout(false);
            }
        
  5. Directory.GetLogicalDrives() がドライブを検索するメソッドです。
    最初は SubFoldersAdded に true(ノードが展開されていない)を設定します。
            private void Form1_Load(object sender, System.EventArgs e)
            {
                treeView1.Nodes.Clear();
    
                TreeNodeEx tne;
                tne = new TreeNodeEx("マイ コンピュータ");
    
                string[] drives = Directory.GetLogicalDrives();
                foreach (string drive in drives) 
                {
                    tne.Nodes.Add(new TreeNodeEx(drive));
                }
                tne.SubFoldersAdded = true;
                treeView1.Nodes.Add(tne);
    
                treeView1.TopNode.Expand();
            }
        
  6. クリックでノードを展開する treeView1_BeforeExpand() メソッドです。
    1つ下の階層のすべてのノードに対して、そのノードに子ノードが追加済みでない場合それを追加します。
        private void treeView1_BeforeExpand(object sender, System.Windows.Forms.TreeViewCancelEventArgs e)
        {
            TreeNodeEx node = (TreeNodeEx)e.Node;
            foreach(TreeNodeEx child in node.Nodes)
            {
                if (child.SubFoldersAdded == false)
                {
                    string path = GetPathFromNode(child);
                    try
                    {
                        DirectoryInfo di = new DirectoryInfo(path);
                        if(di.Exists)
                        {
                            DirectoryInfo[] dirs = di.GetDirectories();
                            foreach (DirectoryInfo dir in dirs) 
                            {
                                child.Nodes.Add(new TreeNodeEx(dir.Name));
                            }
                            child.SubFoldersAdded = true;
                        }
                    }
                    catch(Exception)
                    {   }
                }
            }
        } 
        
  7. TreeNodeEx class は次のページを参考にさせていただきました。
    ファイルやディレクトリをエクスプローラへドラッグ&ドロップするには
    TreeView のノードを展開する処理を含んだ全ソースコードを Handler から提供しています。

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