- PR -

ツリービューの特定ノードのみ反応させる

投稿者投稿内容
はの
会議室デビュー日: 2007/07/11
投稿数: 5
投稿日時: 2007-07-11 07:55
はじめまして、以前から書き込みはしていませんでしたが
参考に色々読ませていただいていました。

開発環境:VS2005(VC#)/Winxp
ツリービュー上で最下層のノードをクリックすると別のツリービューにも
反映させるようにしたいのですが、どのノードをクリックしても
反映してしまいます。

親ノード
 |
 |
 子ノード
 |   |
 |   |
 |   孫ノード
 |   |
 |   孫ノード
 |
 子ノード

↑図で言う孫ノードのみクリック判定をしたいです。

自力で調べても見たのですが、ツリービュー自体あまり資料がないためわからずじまいでした。
#検索の仕方が悪いのかもしれませんが・・・

どなたかわかる方いらっしゃいましたらご教授願いたいのでよろしくお願いいたします。
HIRO
大ベテラン
会議室デビュー日: 2002/06/21
投稿数: 109
投稿日時: 2007-07-11 08:35
クリックされたノードの深さを調べて処理してはどうでしょうか?

この場合は、TreeNode.Levelが使用できると思います。
_________________
--------------------------------------------
HIRO's.NET PowerShell,VB.NET,C#のTipsを掲載しています
HIRO's.NET Blog PowerShell,VB.NET,C#を中心とした技術ネ
よっし〜。
ベテラン
会議室デビュー日: 2007/04/17
投稿数: 89
お住まい・勤務地: 北のほうの国
投稿日時: 2007-07-11 11:23
引用:

HIROさんの書き込み (2007-07-11 08:35) より:

この場合は、TreeNode.Levelが使用できると思います。




Framework2.0以降では Levelプロパティが使用可能ですね。便利だ…
Framework1.1時代には ImageList を使用して実現していました。

ノード位置はマウスダウンイベントで取得させていました。
(コンテキストメニュー表示がうまくいかなかったので)
masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 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 ]
HIRO
大ベテラン
会議室デビュー日: 2002/06/21
投稿数: 109
投稿日時: 2007-07-11 13:37
引用:

HIROさんの書き込み (2007-07-11 08:35) より:
クリックされたノードの深さを調べて処理してはどうでしょうか?

この場合は、TreeNode.Levelが使用できると思います。




追記です。
もしAfterSelectイベントを使用するのであれば
コード:
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
    // 選択されたノードが孫なら(Level = 親は0, 子は1, 孫は2)
    if ( e.Node.Level == 2 )
    {
    }
}


といった感じでしょうか
_________________
--------------------------------------------
HIRO's.NET PowerShell,VB.NET,C#のTipsを掲載しています
HIRO's.NET Blog PowerShell,VB.NET,C#を中心とした技術ネ
masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 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 を何回遡れるかをカウントして返しているような気がします。
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2007-07-11 17:04
純正以外だと、
TreeNodeを継承したMyTreeNodeを作り、中に業務的な区別をするNodeTypeプロパティを実装する方法。
利点は業務クラスになること、欠点はキャスト回数が増えること。
#うーん、可読性や保守性はどうなんだろう?

あとはAfterSelectでキャストしてプロパティ見るだけ。
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-07-11 17:59
引用:

まどかさんの書き込み (2007-07-11 17:04) より:
TreeNodeを継承したMyTreeNodeを作り、中に業務的な区別をするNodeTypeプロパティを実装する方法。
利点は業務クラスになること、欠点はキャスト回数が増えること。



業務クラスの継承元がTreeNodeというのは利点よりも欠点が多いような。

私はTreeNode.Tagにいろいろ入れてしまいますが…
もしくはTreeNodeを継承したジェネリックなTagを持つTreeNodeを使います。

結構この辺りの実装は人によって癖が出そうですね。

スキルアップ/キャリアアップ(JOB@IT)