ツリービューコントロールをフォームに貼り付ける
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); //子フォルダへの再帰呼び出し
}
}
|