質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

4194閲覧

vb.net TreeView DoubleClickイベント 親ノード展開と子ノード選択が重複する

noi_p

総合スコア17

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2020/04/01 04:46

編集2020/04/01 04:55

~環境~
Microsoft Visual Studio Professional 2017 Version 15.9.17
.NET Framework 4.6.1
Windowsフォームアプリケーション

--

vb.net の Windowsフォーム で tree view を利用し、システムメニュー画面を開発してます。
親ノードとしてメニュー分類、子ノードとしてメニューになります。

A.formロード時は親ノード閉じており、親ノードをダブルクリックすると子ノードが展開されます。
※これは標準イベント(?)なので、自らイベントのプログラムは書いてません。

B.子ノードのダブルクリックイベントで、メニュー実行するようにプログラムを書いています。

vb.net

1 Private Sub TreeView_DoubleClick(ByVal sender As Object, ByVal e As MouseEventArgs) Handles TreeView.DoubleClick 2 Dim nodeMenu As TreeNode 3 'ノードを取得 4 nodeMenu = TreeView.GetNodeAt(e.X, e.Y) 5 'ノードが最下層の場合は処理 6 If nodeMenu.Nodes.Count = 0 Then 7 Debug.Print("メニュー実行") 8 End If 9 End Sub

そこで問題なのですが、
Aの親ノードダブルクリック時、子ノードの数がTreeView枠内に収まらない場合、※スクロールバーを表示しています
ダブルクリックをした親ノードがTreeViewの枠の一番上の位置に移動しますが、
ダブルクリックをした親ノードが元々いた位置に子ノードが配置されるため、
Aの親ノードのダブルクリックと、Bの子ノードのダブルクリックのイベントが同時に発生してしまいます。

望む結果としては、
⓵親ノードのダブルクリック時には、子ノードの展開のみにさせたい
⓶子ノードのダブルクリック時のみ、メニュー実行させたい
になります。

解決策を教えて頂きたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Windows のダブルクリック (WM_LBUTTONDBLCLK) はマウスボタンを

押す→離す→押す

で発生し、2回目の押したタイミングでノードが開きます。

一方、Windows Forms の DoubleClick イベントは

押す→離す→押す→離す

で起きるので、マウス直下のノードは開いた後のノードになり、1回目に選択したノードと違っている可能性があります。

解決策は YAmaGNZ さんが書いてらっしゃいますように SelectedNode を参照することです。

投稿2020/04/01 05:24

KOZ6.0

総合スコア2626

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

noi_p

2020/04/01 05:32

回答ありがとうございました。 クリックイベントの押す・離すの理解ができました。
guest

0

ベストアンサー

親Nodeをダブルクリックした際のSelectedNodeは親Nodeなので

VBNET

1Private Sub TreeView_DoubleClick(ByVal sender As Object, ByVal e As MouseEventArgs) Handles TreeView1.DoubleClick 2 Dim nodeMenu As TreeNode 3 'ノードを取得 4 nodeMenu = TreeView1.GetNodeAt(e.X, e.Y) 5 'ノードが最下層の場合は処理 6 If TreeView1.SelectedNode.Nodes.Count = 0 Then 7 Debug.Print("メニュー実行") 8 End If 9End Sub

と選択されているノードの子ノードの数を取ってはどうでしょうか

また、Nodeのダブルクリックなのであれば、TreeView.NodeMouseDoubleClickイベントを使用されるべきかと思います。
現状ですと、ノードの無い空白部分のダブルクリックにも反応します。
追記:すみません、確認したところNodeMouseDoubleClickイベントでも空白部分に反応してしまうようです。

投稿2020/04/01 05:16

編集2020/04/01 05:25
YAmaGNZ

総合スコア10258

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

noi_p

2020/04/01 05:31

早々の回答ありがとうございました。 解決致しました。 また、本題でない箇所への回答も、親切にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問