孝信2008/08/21TreeViewコントロール(ツリービュー)は、エクスプローラの左側のペインなどで使用されている、木構造のデータを表示するためのコントロールだ。通常、TreeViewコントロールのノード(ツリー上の項目)の選択は、ユーザーがマウスなどで行うが、現在選択されているノードをプログラムから変更することもできる。ボタンがクリックされたときなどのタイミングでこれを行うと、選択されているノードが反転表示されず、現在選択しているノードが分からなくなる場合がある。本稿ではその対処について解説する。TreeViewコントロールへのノードの追加まずはTreeViewコントロールにノードを追加する手順について簡単に説明しておく。TreeViewコントロールにおいて、ノードを表すクラスはTreeNodeクラス(System.Windows.Forms名前空間)である(「TIPS:TreeViewコントロールへ項目を追加するには?」も併せて参考にしていただきたい)。最初に、TreeViewコントロールのルートにノードを追加する。これは、TreeViewコントロールのNodesプロパティに対して、AddメソッドによりTreeNodeオブジェクトを追加する。TreeNodeオブジェクトもまた、その子ノードを保持するためのNodesプロパティを持っており、同様にしてAddメソッドにより子ノードを追加できる。以下では例として、Cドライブのディレクトリ構造をTreeViewコントロールで表示するサンプル・コードを示す。WindowsフォームにはTreeViewコントロールを1つ配置し、フォームのLoadイベント・ハンドラと、TreeViewコントロールのAfterSelectイベント・ハンドラを記述している。後者は、配置したTreeViewコントロールをダブルクリックすれば、メソッドのひな型が自動作成される。Subフォルダをツリービューで表示するサンプル・コード(上:C#、下:VB)追加した2つのイベント・ハンドラのみを抜粋。treeView1/TreeView1は配置したTreeViewコントロールを参照している。DirectoryクラスやPathクラスを使用しているため、コードの先頭でSystem.IO名前空間をusing文/Imports文によりインポートする必要がある。AfterSelectイベント・ハンドラでは、クリックされたノードを「e.Node」として取得できる。各ノードでは、TreeNodeコンストラクタ呼び出し時に表示文字列(ラベル)としてフォルダ名を指定しているため、「e.Node.FullPath」により、そのノードに対応したフォルダのフルパスを得ることができる。上記コードを実行した場合の画面は次のようになる。上記サンプル・コードの実行画面フォルダをクリックすると、その下の階層のフォルダが表示される。選択されているノードの変更ではここで、上記のサンプル・プログラムに[1つ上へ]ボタンを追加してみよう。これは現在選択されているノードを、1つ上のノード(親ノード)に変更するためのものだ。現在選択されているノードは、TreeViewコントロールのSelectedNodeプロパティで取得/設定できる。このプロパティに既存のTreeNodeオブジェクトを代入すれば、そのノードが選択されるというわけだ。あるノードの1つ上のノードというのは、TreeNodeオブジェクトのParentプロパティから取得できる。従って、[1つ上へ]ボタンのClickイベント・ハンドラは次のような内容になる。ルート・ノードのParentプロパティの内容は常にnull/Nothingである。Sub[1つ上へ]ボタンのClickイベント・ハンドラ(上:C#、下:VB)ここでポイントとなるのが、最後の行のTreeViewコントロールへのフォーカスの設定だ。これがないと、ボタンがクリックされたときにフォーカスがボタンに移ったままになり、TreeViewコントロールで現在どのノードが選択されているのかが分からなくなってしまう。より自動抽出したものです。7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。TranslatorはPowerPoint用のアドイン。