.NET TIPS

TreeViewコントロールで現在選択されているノードを変更するには?[C#、VB]

デジタルアドバンテージ 遠藤 孝信
2008/08/21

 TreeViewコントロール(ツリービュー)は、エクスプローラの左側のペインなどで使用されている、木構造のデータを表示するためのコントロールだ。

 通常、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コントロールをダブルクリックすれば、メソッドのひな型が自動作成される。

private void Form1_Load(object sender, EventArgs e)
{
  string root = @"c:\";

  TreeNode rootNode = new TreeNode(root);
  treeView1.Nodes.Add(rootNode); // ルート・ノードの追加

  foreach (string dir in Directory.GetDirectories(root))
  {
    // ルート・ノードに子ノードを追加
    rootNode.Nodes.Add(Path.GetFileName(dir));
  }
  rootNode.Expand(); // ルート・ノードの展開(子ノードの表示)
}

// TreeViewコントロールのAfterSelectイベント・ハンドラ
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
  // すでに追加されている子ノードを削除
  e.Node.Nodes.Clear();

  foreach (string dir in Directory.GetDirectories(e.Node.FullPath))
  {
    // ノードに子ノードを追加
    e.Node.Nodes.Add(Path.GetFileName(dir));
  }
}
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  Dim root As String = "c:\"

  Dim rootNode As New TreeNode(root)
  TreeView1.Nodes.Add(rootNode) ' ルート・ノードの追加

  ' ルート・ノードに子ノードを追加
  For Each dir As String In Directory.GetDirectories(root)
    rootNode.Nodes.Add(Path.GetFileName(dir))
  Next

  rootNode.Expand() ' ルート・ノードの展開(子ノードの表示)

End Sub

' TreeViewコントロールのAfterSelectイベント・ハンドラ
Private Sub TreeView1_AfterSelect(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterSelect

  ' すでに追加されている子ノードを削除
  e.Node.Nodes.Clear()

  ' ノードに子ノードを追加
  For Each dir As String In Directory.GetDirectories(e.Node.FullPath)
    e.Node.Nodes.Add(Path.GetFileName(dir))
  Next
End Sub
フォルダをツリービューで表示するサンプル・コード(上:C#、下:VB)
追加した2つのイベント・ハンドラのみを抜粋。treeView1/TreeView1は配置したTreeViewコントロールを参照している。なお、DirectoryクラスやPathクラスを使用しているため、コードの先頭でSystem.IO名前空間をusing文/Imports文によりインポートする必要がある。

 AfterSelectイベント・ハンドラでは、クリックされたノードを「e.Node」として取得できる。また各ノードでは、TreeNodeコンストラクタ呼び出し時に表示文字列(ラベル)としてフォルダ名を指定しているため、「e.Node.FullPath」により、そのノードに対応したフォルダのフルパスを得ることができる。

 上記コードを実行した場合の画面は次のようになる。


上記サンプル・コードの実行画面
フォルダをクリックすると、その下の階層のフォルダが表示される。

選択されているノードの変更

 ではここで、上記のサンプル・プログラムに[1つ上へ]ボタンを追加してみよう。これは現在選択されているノードを、1つ上のノード(親ノード)に変更するためのものだ。


[1つ上へ]ボタンを追加

 現在選択されているノードは、TreeViewコントロールのSelectedNodeプロパティで取得/設定できる。このプロパティに既存のTreeNodeオブジェクトを代入すれば、そのノードが選択されるというわけだ。また、あるノードの1つ上のノードというのは、TreeNodeオブジェクトのParentプロパティから取得できる。

 従って、[1つ上へ]ボタンのClickイベント・ハンドラは次のような内容になる。なお、ルート・ノードのParentプロパティの内容は常にnull/Nothingである。

private void button1_Click(object sender, EventArgs e)
{
  if (treeView1.SelectedNode.Parent != null)
  {
    treeView1.SelectedNode = treeView1.SelectedNode.Parent;
  }
  treeView1.Focus(); // フォーカスを設定
}
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

  If Not TreeView1.SelectedNode.Parent Is Nothing Then
    TreeView1.SelectedNode = TreeView1.SelectedNode.Parent
  End If

  TreeView1.Focus() ' フォーカスを設定
End Sub
[1つ上へ]ボタンのClickイベント・ハンドラ(上:C#、下:VB)

 ここでポイントとなるのが、最後の行のTreeViewコントロールへのフォーカスの設定だ。これがないと、ボタンがクリックされたときにフォーカスがボタンに移ったままになり、TreeViewコントロールで現在どのノードが選択されているのかが分からなくなってしまう。End of Article

カテゴリ:Windowsフォーム 処理対象:TreeViewコントロール
使用ライブラリ:TreeViewコントロール(System.Windows.Forms名前空間)
使用ライブラリ:TreeNodeクラス(System.Windows.Forms名前空間)
関連TIPS:TreeViewコントロールへ項目を追加するには?

この記事と関連性の高い別の.NET TIPS
TreeViewコントロールへ項目を追加するには?
TreeViewコントロールで効率的にツリーを構築するには?
[ASP.NET]TreeViewコントロールで深階層のツリー情報を効率よく読み込むには?
[ASP.NET]TreeViewコントロールで深階層のツリー情報を効率よく読み込むには?
[ASP.NET]データベースからツリー・メニューを作成するには?
[ASP.NET]データベースからツリー・メニューを生成するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間