.NET TIPS

TreeViewコントロールでテキスト部分のクリックを検出するには?[C#、VB]

デジタルアドバンテージ 遠藤 孝信
2009/06/18

 WindowsフォームのTreeViewコントロールでは、CheckBoxesプロパティをTrueに設定することにより、各ノードをチェックボックス付きにし、複数の項目を同時に選択可能にできる(下図)。


チェックボックス付きTreeViewコントロールの実行例

 実行時には、チェックボックス部分をクリックして、チェックのオン/オフを切り替えられるが、本稿では、ノードのテキスト部分をクリックしても、チェックボックスをオン/オフできるようにする方法を示す。

HitTestメソッドによるクリック位置の判定

 TreeViewコントロールには「HitTest」というメソッドが用意されており、コントロール内の指定した位置に何があるのかを知ることができる。

 このHitTestメソッドの戻り値はTreeViewHitTestInfoクラス(System.Windows.Forms名前空間)のオブジェクトであり、そのLocationプロパティは、以下の表のいずれかの値となる。

説明
AboveClientArea TreeViewのクライアント部分の上側
BelowClientArea TreeViewのクライアント部分の下側
Image TreeViewまたはTreeNodeコントロールに含まれているイメージ内
Indent ノードのインデント領域部分
Label ノードのテキスト部分(ラベル部分)
LeftOfClientArea TreeViewのクライアント部分の左側
None TreeViewのクライアント領域内で、ノード以外の部分
PlusMinus ノードの「+」部分
RightOfClientArea TreeViewのクライアント部分の右側
RightOfLabel ノードのテキストの右側
StateImage TreeNodeの状態を示すイメージ内
TreeViewHitTestLocations列挙体(System.Windows.Forms名前空間)の値

 従って、今回の場合では、マウス・クリックされたときにHitTestメソッドを呼び出し、その戻り値のLocationプロパティが「TreeViewHitTestLocations.Label」である場合に、現在選択されているノードを調べ、チェックのオン/オフを切り替えればよい。このケースでは、TreeViewHitTestInfoオブジェクトのもう1つのプロパティであるNodeプロパティが、いまクリックされたノードを示している。

 以上を実装すると、次のようなコードとなる。ここではマウスのボタンが押されたときに発生するMouseDownイベントのイベント・ハンドラとして、上記の処理を行っている。

// TreeViewコントロールのMouseDownイベント・ハンドラ
private void treeView1_MouseDown(object sender, MouseEventArgs e)
{
  TreeViewHitTestInfo ht = treeView1.HitTest(e.Location);

  if (ht.Location == TreeViewHitTestLocations.Label)
  {
      ht.Node.Checked = !ht.Node.Checked;
  }
}
' TreeViewコントロールのMouseDownイベント・ハンドラ
Private Sub TreeView1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TreeView1.MouseDown

  Dim ht As TreeViewHitTestInfo = TreeView1.HitTest(e.Location)

  If ht.Location = TreeViewHitTestLocations.Label Then
    ht.Node.Checked = Not ht.Node.Checked
  End If
End Sub
ノードのテキスト部分のクリック処理(上:C#、下:VB)

 チェックのオン/オフを切り替えは、現在のチェックの状態を反転することにより行える。End of Article

カテゴリ:Windowsフォーム 処理対象:TreeViewコントロール
使用ライブラリ:TreeViewコントロール(System.Windows.Forms名前空間)
使用ライブラリ:TreeViewHitTestInfoクラス(System.Windows.Forms名前空間)
使用ライブラリ:TreeViewHitTestLocations列挙体(System.Windows.Forms名前空間)

この記事と関連性の高い別の.NET TIPS
TreeViewコントロールで現在選択されているノードを変更するには?
TreeViewコントロールへ項目を追加するには?
TreeViewコントロールで効率的にツリーを構築するには?
[ASP.NET]TreeViewコントロールで深階層のツリー情報を効率よく読み込むには?
[ASP.NET]TreeViewコントロールで深階層のツリー情報を効率よく読み込むには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム 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 記事ランキング

本日 月間