TreeViewでダブルクリックするとチェックボックスをオンできるようにするには

解決


kanegon  2003-07-16 03:09:23  No: 107792

VB6.0でTreeViewである階層の場所をダブルクリックするとその下の階層のチェックボックスがオンになるようにしたいのですが、そのようなことは可能なのでしょうか。
例)
                   レ a ------レ b
  aにチェックを入れる     |
                          ----レ c    b,cもチェックが入る
このような感じにしたいです。

また、選択されている項目がわかるようにする方法も知りたいです。
よろしくお願いいたします。


魔界の仮面弁士  2003-07-16 04:06:42  No: 107793

> 下の階層のチェックボックスがオンになるようにしたいのですが

標準の機能としてはありませんので、ご自身でそのようなコードを
記述するしか無いと思います。

例えば、下記のようなプロシージャを用意してやり、その上で、
  CheckSubNodes(任意のNodeオブジェクト) = TrueまたはFalse
のようにすれば、その下にあるチェックボックスを、
一括してOn/Offさせる事ができます。

Private Property Let CheckSubNodes(ByVal BaseNode As Node, ByVal Checeked As Boolean)
    If Not BaseNode Is Nothing Then
        Dim N As Node
        BaseNode.Checked = Checked
        Set N = BaseNode.Child
        Do Until N Is Nothing
            CheckSubNodes(N) = Checked
            Set N = N.Next
        Loop
    End If
End Property

> 選択されている項目がわかるようにする
こちらは、質問の意図がよくわかりませんでした。

# 選択項目を目立たせたい、という意図なら、Nodeオブジェクトの
# Bold、BackColor、ForeColorプロパティを、逐次変更してやる、
# という手もありますけれど…。

そもそもチェックボックス付きなら、チェックが入っているものが
選択済みの項目である…という事では無いのでしょうか?(^^;

また、フォーカスのあるノードに対しては、反転表示されていますよね。
HideSelectionプロパティをTrueにしておけば、フォーカスが無い時も
反転表示されたままになりますし。


kanegon  2003-07-16 04:26:35  No: 107794

魔界の仮面弁士様
早速のご返事誠にありがとうございます。

VBについても素人同然なのですが、TreeViewについては本当に全然わかって
おりません。

最終的にはDBよりTreeViewを作成して表示し、ある階層のチェックボックスを
ダブルクリックすると、その下の階層すべてにチェックボックスをつけることが
出来ないかということで調べています。

>> 選択されている項目がわかるようにする
>こちらは、質問の意図がよくわかりませんでした。

なので、その指定した場所がわかるようなものが欲しいということで
質問させていただいたのですが、申し訳ありません。

>ByVal BaseNode As Node, ByVal Checeked As Boolean
この値はどのように拾うのか教えてもらえないでしょうか。

低レベルな質問で申し訳ございませんが、よろしくお願いいたします。


kanegon  2003-07-16 04:52:27  No: 107795

追加というわけではないのですが、実際は複雑で

レ a------レ b -------レ c
       |
       |
       ---レ d--------レ e
                 |
                 -----レ f

(aにチェックをつけるとb〜fにもチェックをつける)
というやり方も魔界の仮面弁士様のコードでできるのでしょうか
よろしくお願いします。


魔界の仮面弁士  2003-07-16 05:37:30  No: 107796

えぇと、とりあえず先のプロシージャを、
TreeViewの貼ってあるフォームにコピーしてください。
その上で、とりあえず、TreeViewコントロールのNodeClickイベントに
    CheckSubNodes(Node) = True
という一行を書いてみてください。

そうすると、任意のノードをクリックした時に、それ自身と
その子孫にあたるノード全てがチェックされるようになると思います。

上記のコードで、Trueに替わりにFalseを指定すれば、子孫全ての
チェックボックスの状態がオフになります。

実際にはNodeClickではなく、他のイベントで処理する事に
なるかも知れませんが、その場合でも基本的には同じです。

> この値はどのように拾うのか教えてもらえないでしょうか
ノードオブジェクトの指定方法がわからない、という意味でしょうか。

NodeClickイベントやNodeCheckイベントなどでは、そのとき
操作されたノードが、イベントの引数として得られますから、
それを使う事ができると思います。

あるいは、SelectedItemプロパティを使って、
現在選択状態にあるノードを取得するという事もできます。

また、(MouseDownなどの)マウス系イベントなどの場合は、TreeViewの
HitTestメソッドを使うことで、x,y座標からノードを割り出せます。


kanegon  2003-07-16 18:10:42  No: 107797

できるようになりました。
魔界の仮面弁士様  丁寧なご回答どうもありがとうございました。
また伺うことがあると思いますのでどうぞよろしくお願いいたします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加