ツリービューは文字どおり、木の幹、枝のようにノード(節)が連結した形式のコントロールです。
  


  ツリービューコントロールをフォームに貼り付ける
  ツリービューコントロールの名前を変える
  ツリービューの大きさを変更する
  ツリービューの位 置を変更する
  ツリー ビューにノードを付け加える
  ツリー ビューのノード名を変更する
  ツリービューを展開する
  ツリービューにチェックボックスをつ ける
  ツリービューにアイコンをつける
  ツリー ビューを並べ替える
  ツリー ビューの背景色を変える
  ツリー ビューの描画色を変える
  ツリー ビューのノードパスの取得とパスセパレータの設定
  マウスクリックされたノードを選択状態にする
  ノードイン デックスを取得する
  ドライブの デイレクトリ情報をツリービューとして表示する

 

ツリービューコントロールをフォームに貼り付ける

  1   ツールボックス(ツールボックスが開いていない場合は、表示メニューから「ツールボックス」を選択 してください。)から、 「TreeView」
     をドラッグし、フォーム上にマウスカーソルを持って行く。

  2 フォーム上で、ツリービューを表示する大きさの指定は、マウスのドラッグにより行います。

  3 デフォルトで、ツリービューのネーミングは、treeView1、treeView2・・・・の順となりま す。

ツリービューコントロールの名前を変える

  1 フォームイメージが表示されるデザインビューの状態にし、画面右下のプロパティウィンドウのName欄の内容を変更しま す。プロパティ
   ウィンドウ が表示されない場合は、表示メニューから「プロパティウィンドウ」を選択してください。

  ※ ツリービューに限らず、ツールボックスから貼り付けたコントロールの名称を、プログラム内から変更することはできません。これは、プロ
    グラムがこ のNameプロパテイでコントロールを区別しているためです。


ツリービューの大きさを変更する

  1 ネーミングと同様に、プロパティウィンドウのSize欄を変更してくださ い。カンマの左側がツリービューの横幅、右側が縦幅となりま す。

  2 Sizeはプログラムの中から変更することができます。例えば、
           treeView1.Size=New System.Drawing.Size(300, 200);
                                                                                     という具合です。
              他のコーディング方法としては、
                treeView1.Width=300;
                treeView1.Height=200;

       とする方法があります。

ツリービューの位 置を変更する

  1 プロパティウィンドウのLocation欄を変更して ください。カンマの左側が画面左端からの位置、右側が画 面上端からの 位置となります。

  2 Sizeはプログラムの中から変更することができます。例えば、
           treeView1.Location=New System.Drawing.Point(20, 15);
                                                                                       という具合です。
              他のコーディング方法としては、
                treeView1.Left=20;
                treeView1.Top=15;

       とする方法があります。
 

ツリー ビューにノードを付け加える

 
 コントロールを貼り付けただけでは、ツリービューは何の動作もしません。ツリービューは、文字どおり、木の枝のように、構成枝をぶら下 げて行くコントロールです。

  それでは、ツリービューに「芝生」、「花」という名前のノード(枝)を付け加えてみましょう。

   
            treeView1.Nodes.Add("庭園");
           treeView1.Nodes.Add("花");

   これを実行すると、ツリービューに、2つの項目が表示されます。
   ツリービューコントロールの場合、既存のノードに次々に新しいノードをぶら下げていくのが、基本的な動作となります。
  
   上記のコードの場合、既存のノードが存在しないため、ノードの根っこが空白であることが分かります。
   既存のノードに新しいノードをぶら下げる方法としては、主に次の2つがあります。

   @ 既存のノードを選択状態にした後に、新しいノードをぶら下げる
     この場合、まず既存のノードを選択状態にします。ツリービューの場合、選択状態のノードは、
SelectedNodeプロパティで設定します。

               treeView1.SelectedNode =treeView1.Nodes("花");

     次にぶら下げる新しいノードを設定します。「バラ」と「ヒマワリ」を加えてみましょう。

           treeView1.Nodes.Add("バラ");
           treeView1.Nodes.Add("ヒマワリ");

     これを実行すると、花ノードの下に2つのノードがぶら下がります。

   A SelectedNodeプロパティを使わずに、新しいノードをぶら 下げる
            この方法では、ぶら下げる親ノードを直接指定します。
          
            treeView1.Nodes.("花").Nodes.Add("バラ");
             treeView1.Nodes.("花").Nodes.Add("ヒマワリ");

                  
又は、  

            treeView1.Nodes[1].Nodes.Add("バラ");
             treeView1.Nodes.[1].Nodes.Add("ヒマワリ");

      後者では、"花"を指定する代わりに、1を入れています。この数字は、ノードインデックスです。
      ツリービューでノードを生成した場合、生成順にインデックスが0、1、2、・・・と付きます。上記の場合、"庭園"がインデックス0、"花"
     がインデックス1となります。
      それでは、"ヒマワリ"はインデックスは何でしょう。ヒマワリのインデックスも1となります。"花"とインデックスが重なりますが、例えば、
     ヒマワリに「種」というノードをぶら下げる場合には、

             treeView1.Nodes.[1].Nodes[1].Nodes.Add("種");

  
   とします。階層の分だけ、ピリオドでつないでいけばいいだけですので、簡単ですね。    


ツリー ビューのノード名を変更する

  
   ツリービューのノードは、基本的にプログラム内で生成されますので、ノード名をプロパテイウィンドウから変更することはできませ ん。で
    はどうするのでしょうか。
      
「庭園」ノードを、「ガーデン」ノードに変更してみましょう。ノード名は、各ノードのTextプロ パティで設定・変更します。

              treeView1.Nodes("庭園").Text="ガーデン";


     これだけです。
     また、プログラムの実行画面上からも簡単にノード名を変更できます。
     名前を変えたいノード上でマウスクリックをします。すると、ノードのテキスト部分が反転しますので、そのまま、反転したテキストボックス
    内に変更後の名前を入力してください。

     ※ノード名の変更は、ツリービューのLabelEditプロパティが真のときのみ有効です。プログラムからは、

                treeView1.LabelEdit=true;

            としてください。

ツリービューを展開する

      ここまで、作業をしてくると、「花」ノードにマイナスマークが付いているのが分かります。マイナスマークは、このノードの下に子ノードが
     あ り展開済であることを示します。一方、プラスマークは、
こ のノードの下に子ノードがあり、未展開であることを示します。
      プログラムの実行画面上からは、プラスマークをマウスクリックすることによって、ノードは展開され、マイナスマークに変わります。

      プログラム的には、次のとおりコーディングします。

      @すべてのノードを展開するとき

                    treeView1.ExpandAll();   

             A特定のノードを展開するとき
                例えば、花ノードを展開するときは、Expandメソッドを使いま す。

                treeView1.Nodes("花").Expand();


ツリービューにチェックボックスをつ ける
      
      チェックボックスを付けるには、ツリービューのプロパテイウィンドウで、CheckBoxesプロパテ イを真にしてください。プログラムから は

             
    treeView1.CheckBoxes=true; 
     
と します。

ツリービューにアイコンをつける
    
       
文字情報だけでは、ツリービューは味気ないものになってしまいます。
       アイコンの大きさは自由に設定できますが、個々のノードに固有の画像データを読み込むというメソッドはツリービューにはありませ
      ん。このため、別に、イメージリストを作って、
イ メー ジリストコントロールとツリービューコントロールとを関連付ける方法が一般的です。

       では、これをステップを追って見てみましょう。

      @イメージリストを作る
        イメージリストを使って、コントロールに画像を付加する手法は、他のコントロールでも共通です。
        まず、イメージリストコントロール(ImageList) をツールボックスからフォーム上にドラッグします。
        すると、フォームイメージの下に、imageList1コントロールが表示されます。デフォルトでのネーミングの規則は、他のコントロー ルと
       同様に、
imageList1 , imageList2 , ・・・ という並びになります。

        さて、イメージリストは、特定の大きさの画像ファイルが複数ある場合に多く用いられます。フォーム上のタスクバーアイコンやボタン
       アイコンなど、特定の大きさの画像が多数必要な用途に向いています。

        画像のサイズは、イメージリストのImageSizeプロパテイで設定します。カンマの左側が画像横幅、右側が画像縦幅となります。

        アイコンの場合、通常は、画像横幅=画像縦幅として問題ありません。
    
         ※ ImageSizeプロパテイは、プログラム上から取得す ることはできますが、設定することはできません。

           例えば、
             int w,h;
                            w=imageList1.ImageSize.Width ; h=imageList1.ImageSize.Height;
           は可能ですが、

              int w,h;
                            w=25;h=25;                      
                            imageList1.ImageSize.Width=w;=imageList1.ImageSize.Height;=h;
           はエラーとなります。

                次にイメージリストに画像ファイルを読み込みます。

                    プロパテイウィンドウのImagesプロパテイ右側には(コレクション)という表示がありますが、この表示の意味は、このプロパテイが複
        数の要素を持つことを示しています。
                    プロパテイが(コレクション)である場合、(コレクション)の右側にある「・・・」をクリックすると、Imageコレクションエディタダイアログが
        開きます。
         このダイアログ内で、追加ボタンを押すと、「ファイルを開く」ダイアログボックスが開きます。 
         ここで、イメージリストに読み込む画像ファイルを指定すると、 Imageコレクションに新しいメンバーとして画像が追加され、画像の縮
        小イメージがメンバリストに追加されます。

      Aイメージリストコントロールとツリービューコント ロールとを関連付ける
                では、次にツリービューとこのイメージリストを関連付けましょう。
       ツリービューのプロパテイウィンドウで、ImageList
プロパテイに "imageList1"を設定します。
       これで関連付けは終わりです。他のコントロール(例えばリストビュー)と、イメージリストを共有することも可能です。

      Bノードにアイコンを貼り付ける
       ノードにアイコンをビジュアル的に美しいツリービューに仕上がります。
       もう一度、イメージリストのコレクションを開いてみてください。すると、メンバリストの左端に、ボタン状の番号0、1、2、・・・が表示さ れ
      ています。これを「イメージインデックス」と言います。ツリービューのノードアイコンには、このイメージインデックスを指定します。

         例えば、次のとお り。

                        treeView1.Nodes("花"). ImageIndex=3;
                    treeView1.Nodes("花").SelectedImageIndex = 3;

        1行目は、通常表示時のイメージ指定、2行目はノードがセレクト状態の場合のイメージ指定です。例えば、セレクト状態の場合に
      アイコンの表示を変化させる場合などに用います。

ツリー ビューを並べ替える

            ツリービューには、Sortプロパ テイがあるので、これは 簡単に行うことができます。このプロパテイを"true"にしてください。


ツリー ビューの背景色を変える

            ツリービューには、他のコントロール同様にBackColorプ ロパテイがあります。数字で背景色を指定するときは、R(赤)、G(緑)、B(青)
    の順に、0〜255の範囲で値を指定してください。例えば、赤は「255,0,0」、 白は「255,255,255」という具合です。

     ピクチャーボックスから、色をクリック指定することもできます。

     
プログラム上から色指定する場合は、
                    treeView1.BackColor=Color.Red;
                         又は    

                    treeView1.BackColor=Color.FromArgb(255, 0,0);          

     
という風に指定します。

ツリー ビューの描画色を変える

 
   ツリービューの枝の描画線、ノード名テキストの描画色は、ForeColorプロパテイ で指定します。
    プログラム上から色指定する場合は背景色の 設定と同様 に、

                    treeView1.ForeColor=Color.Black;

 
   等と指定します。

ツリー ビューのノードパスの取得とパスセパレータの設定

    ツリービューの枝のつながりについて、特定のノードを指定してパスを取得することができます。例えば、エクスプローラ のように、ド ライブ
  上のディレクトリ構造を、そのままツリービューとして表すような場合に利用価値があります。

       ノードパスの取得は、プログラム上から次のようにコーデイングします。

                     string s;
                    treeView1.SelectedNode= treeView1.Nodes[1].Nodes[1]
.Nodes[0];
                    s=treeView1.SelectedNode.FullPath;
                     
       すると、例えば、s="花\ヒマワリ\種"と、文字変数sでノードパスが取得できます。
    このうち、パスセパレータは、ツリービューのPathSeparatorプ ロパテイで設定しますが、デフォルトでは、「\」記号となっています



マウスクリックされたノードを選択状態にする

    マウスイベントには、マウスダウン、マウスアップなど関連イベントが多数ありますが、 マウスクリックされたノードを取得するには、 マウスダ
   ウンイベントを使うと便利です。

   
                private void treeView1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
                    {
                      string s,name;
                      treeView1.SelectedNode=treeView1.GetNodeAt(e.X, e.Y); //マウス座標から選択位置のノードを取得
                      if (treeView1.SelectedNode!=null)  //ノード上でクリックされたか?
                      {
                        s=treeView1.SelectedNode.FullPath; //ノードパスの取得
                        name=treeView1.SelectedNode.Text; //ノード名の取得
                      }
                    }
ノードイン デックスを取得する

 
    これまで、ノードインデックスを何度か使って来ました。
      明示的に、ノードインデックスを取得するには、次のとおりコーデイングします。

                   int i,j;
                   i=treeView1.SelectedNode.Index;    //ノードインデックスの取得
                   j=treeView1.SelectedNode.Parent.Index;  //親ノードの
ノードインデックスの取得

 
    上記の「種」ノードの場合、「ヒマワリ」ノードに
「種」ノードは最初にぶら下がっていますから、i は 0、「ヒマワリ」ノードは、「花」ノード
    に2番目にぶら下がっていますから、j=1となります。


ドライブのデイレクトリ情報をツリービューとして表示する

     
ツリービューの応用例として、コンピュータ上の各ドライブを走査し、
デイレクトリとファイルを一連のツリーに全表示するプログラムを示し
    ます。なお、ファイルについては、数が膨大になるため1MB以上の容量のファイルのみ表示することとしています。
            用意しておくコントロールは、ツリービューtreeView1 と、処理時間の経過を表示するプログレスバー
progressBar1です。
    少々長いですが、簡単な解説をコメント行として付けていま す。

                    using System.IO;               // デイレクトリ検索に用いるクラス
                    using System.Management;  // ドライブ情報取得に用いるクラス
                    public int i;
                    int j;
                    public bool shoki;
 
                    string s;
                    int totalvol,k;     //サーチ対象の総容量

                    //ドライブ情報の取得
                       
                        string[] totaldrive = Directory.GetLogicalDrives() ;
                        int drnum=totaldrive.Length;     //全接続ドライブ数の取得(内部、外部、ネットワークドライブを含む)
 
                    //ツリービューの初期化    
                        treeView1.Nodes.Clear();
                        treeView1.ExpandAll();

                   //プログレスバーの初期化
                        progressBar1.Maximum=drnum;   //最大値は
全接続ドライブ数
                        progressBar1.Minimum=0;          //最小値

                   //値の初期化
                        totalvol=0;
                        totals=0;
                        i=-1; j=0;
                        progressBar1.Value=0;
               
                   //走査開始
                        ManagementObject disk = new ManagementObject() ;
                       foreach(string drive in totaldrive)
                        {
                            disk.Path = new ManagementPath("Win32_LogicalDisk='" + drive[0] + ":'") ;
                            long disksize ;
                            try disksize = long.Parse("" + disk["Size"]) ; //デイスク容量の取得
                            catch disksize=0;    //ネットワーク接続権限がない場合、例外が発生するため、
デイスク容量=0とする
                            i+=1;    
                            progressBar1.Value=i;
                            if (disksize!=0)   //アクセス可能なデイスクか?
                            {
  
                              treeView1.Nodes.Add(totaldrive[i]);     //ドライブノードの生成
                             
                                TreeNode node = treeView1.Nodes[j];  //ドライブノードを親ノードとしてデイレクトリ構造を展開
                                j+=1;
                               
                                shoki=true;
                                CreateTree(node,i);
  //ノード展開。すべてのデイレクトリを走査・展開するため、再起呼び出し処理
                            }
                       }
     
    次の
サブルーチンでは、ドライブ毎にデイレクトリを走査・展開するため、再起呼び出 し処理を行います。

                    private void
CreateTree(TreeNode node,int i)
                    {
                       int l;
                        string dirName = node.FullPath;   //走査対象デイレクトリ
                        if (Directory.Exists(dirName) == false) return; //
デイレクトリが存在しない場合は復帰
                        DirectoryInfo directory = new DirectoryInfo(dirName);     //デイレクトリ情報の取得
 
                       FileInfo [] file1 = directory.GetFiles();                          //ファイル情報の取得

                        if (shoki)
                        {
                         //ドライブ直下のファイルノードの生成
                            shoki=false;
                            foreach(FileInfo file in file1)
                            {
                                l=(int)file.Length/1024/1024; // ファイル容量取得
                                if ( l>=1)
node.Nodes.Add(file.Name);  //1MB以上のファイルノードの生成
                            }
                         }
           
                        DirectoryInfo[] subDirectories = directory.GetDirectories();
   //サブデイレクトリ情報の取得
                        foreach(DirectoryInfo subDirectory in subDirectories)
                        {
                            TreeNode newNode = node.Nodes.Add(subDirectory.Name); //サブデイレクトリノードの表示
                             try
                            {
                                FileInfo [] files = subDirectory.GetFiles();
                                foreach(FileInfo file in files)
      //サブデイレクトリ内のファイル情報の取得
                                {
                                    l=(int)file.Length/1024/1024; // ファイル容量取得
                                    if ( l>=1) newNode.Nodes.Add(file.Name);  //1MB以上のファイルノードの生成
                                }
                            }
                            catch {}
                     
                           
CreateTree(newNode,i);  //子フォルダへの再帰呼び出し
                        }
                    }