- - PR -
ツリービューの特定ノードのみ反応させる
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-07-11 07:55
はじめまして、以前から書き込みはしていませんでしたが
参考に色々読ませていただいていました。 開発環境:VS2005(VC#)/Winxp ツリービュー上で最下層のノードをクリックすると別のツリービューにも 反映させるようにしたいのですが、どのノードをクリックしても 反映してしまいます。 親ノード | | 子ノード | | | | | 孫ノード | | | 孫ノード | 子ノード ↑図で言う孫ノードのみクリック判定をしたいです。 自力で調べても見たのですが、ツリービュー自体あまり資料がないためわからずじまいでした。 #検索の仕方が悪いのかもしれませんが・・・ どなたかわかる方いらっしゃいましたらご教授願いたいのでよろしくお願いいたします。 | ||||||||
|
投稿日時: 2007-07-11 08:35
クリックされたノードの深さを調べて処理してはどうでしょうか?
この場合は、TreeNode.Levelが使用できると思います。 _________________ -------------------------------------------- HIRO's.NET PowerShell,VB.NET,C#のTipsを掲載しています HIRO's.NET Blog PowerShell,VB.NET,C#を中心とした技術ネ | ||||||||
|
投稿日時: 2007-07-11 11:23
Framework2.0以降では Levelプロパティが使用可能ですね。便利だ… Framework1.1時代には ImageList を使用して実現していました。 ノード位置はマウスダウンイベントで取得させていました。 (コンテキストメニュー表示がうまくいかなかったので) | ||||||||
|
投稿日時: 2007-07-11 13:08
AfterSelect イベントなんてどうでしょうか。
ただ、クリックだけではなく、選択ノードが変更されたときに発生します。 e.Action でマウス操作によって発生したかどうかはわかりますが、 それで判別できなければ MouseUp or Down イベントの中で GetNodeAtメソッドを使ってノードを取得することが多いのではないかと思います。 Private Sub tree_AfterSelect( ByVal sender As Object, ByVal e As TreeViewEventArgs) Handles tree.afterselect 'そのノードの子の数ゼロ=最下層 If (e.Node.Nodes.Count = 0) Then '最下層のときの処理 親を遡りながら何らかの処理(e.Node) End If End Sub private sub 親を遡りながら何らかの処理(node as TreeNode) if ( node.Parent is nothing ) then return 【行いたい処理】 '再帰処理 親を遡りながら何らかの処理(node.Parent) end sub VB.NET で書いてしまいました。読みかえてくださいね。 [ メッセージ編集済み 編集者: masa 編集日時 2007-07-11 13:10 ] [ メッセージ編集済み 編集者: masa 編集日時 2007-07-11 13:20 ] | ||||||||
|
投稿日時: 2007-07-11 13:37
追記です。 もしAfterSelectイベントを使用するのであれば
といった感じでしょうか _________________ -------------------------------------------- HIRO's.NET PowerShell,VB.NET,C#のTipsを掲載しています HIRO's.NET Blog PowerShell,VB.NET,C#を中心とした技術ネ | ||||||||
|
投稿日時: 2007-07-11 16:37
[quote]
masaさんの書き込み (2007-07-11 13:08) より: private sub 親を遡りながら何らかの処理(node as TreeNode) if ( node.Parent is nothing ) then return 【行いたい処理】 '再帰処理 親を遡りながら何らかの処理(node.Parent) end sub [/quote 考えてみたらあえて再帰処理をするまでもなかったですね。 private void 親を遡りながら何らかの処理(TreeNode node) { TreeNode targetNode = node; while ( targetNode != null ) { 【行いたい処理】 // 親をセット targetNode = targetNode.Parent } } TreeNode.Level も Parent を何回遡れるかをカウントして返しているような気がします。 | ||||||||
|
投稿日時: 2007-07-11 17:04
純正以外だと、
TreeNodeを継承したMyTreeNodeを作り、中に業務的な区別をするNodeTypeプロパティを実装する方法。 利点は業務クラスになること、欠点はキャスト回数が増えること。 #うーん、可読性や保守性はどうなんだろう? あとはAfterSelectでキャストしてプロパティ見るだけ。 | ||||||||
|
投稿日時: 2007-07-11 17:59
業務クラスの継承元がTreeNodeというのは利点よりも欠点が多いような。 私はTreeNode.Tagにいろいろ入れてしまいますが… もしくはTreeNodeを継承したジェネリックなTagを持つTreeNodeを使います。 結構この辺りの実装は人によって癖が出そうですね。 |