none
(Windoe Form Application in C#) HoverSelection in TreeView Control RRS feed

  • 質問

  • ListViewにはHoverSelectionがありますが、TreeViewには見当たりません。どのようにするべきでしょうか?現在の実装では、TreeView内で直接マウス右クリックをすると、実際の選択は正しくしますが、ネービー色はTreeViewの親フォルダ―になってしまいます。どのようにしたら、実際の選択されたノードの色をネービーに変えられるのでしょうか?

    よろしくお願いします。

    2010年10月22日 4:14

回答

  • TreeViewコントロールでも、ListViewのHoverSelectionと同様の動作を実装したい、

    ということでしょうか。

     

    TreeViewコントロールには、「NodeMouseHover」というイベントがあります。

    このイベントは、マウスポインタがTreeViewの要素の上に移動した時に発生します。

    発生するには、ある程度要素の上にマウスポインタが存在する必要があります。

    (素早く通過するだけでは発生しない)

    ListViewコントロールのHoverSelectionで要素が選択される場合も同様で、ある程度要素

    の上にマウスポインタが存在する必要があります。

     

    つまり、このイベントを補足したタイミングで、その要素を選択状態にしてあげるコードを

    書くことで、HoverSelectionとほぼ同様の動作を実現できると思います。

    HoverSelectionで行われている処理は以下と思われます。

     

    ・対象の要素を選択状態にする。

    ・もしコントロールにフォーカスがなければ、フォーカスを与える。

     

    上記をNodeMouseHoverイベントに実装すると、以下のような感じになると思います。

     

    private void treeView1_NodeMouseHover(object sender, TreeNodeMouseHoverEventArgs e)
    {
    	this.treeView1.Focus();
    	this.treeView1.SelectedNode = e.Node;
    }
    
    

    • 回答としてマーク 山本春海 2010年10月28日 8:09
    2010年10月22日 6:43
  • ちなみに、TreeViewで選択した要素が子要素を持っている場合に自動で展開したい

    場合は、以下のような感じで出来ます。

     

    private void treeView1_NodeMouseHover(object sender, TreeNodeMouseHoverEventArgs e)
    {
    	this.treeView1.Focus();
    	this.treeView1.SelectedNode = e.Node;
    	if (e.Node.Nodes.Count != 0)
    	{
    		if (!e.Node.IsExpanded)
    		{
    			e.Node.Expand();
    		}
    	}
    }
    
    

    • 回答としてマーク 山本春海 2010年10月28日 8:09
    2010年10月22日 6:56

すべての返信

  • TreeViewコントロールでも、ListViewのHoverSelectionと同様の動作を実装したい、

    ということでしょうか。

     

    TreeViewコントロールには、「NodeMouseHover」というイベントがあります。

    このイベントは、マウスポインタがTreeViewの要素の上に移動した時に発生します。

    発生するには、ある程度要素の上にマウスポインタが存在する必要があります。

    (素早く通過するだけでは発生しない)

    ListViewコントロールのHoverSelectionで要素が選択される場合も同様で、ある程度要素

    の上にマウスポインタが存在する必要があります。

     

    つまり、このイベントを補足したタイミングで、その要素を選択状態にしてあげるコードを

    書くことで、HoverSelectionとほぼ同様の動作を実現できると思います。

    HoverSelectionで行われている処理は以下と思われます。

     

    ・対象の要素を選択状態にする。

    ・もしコントロールにフォーカスがなければ、フォーカスを与える。

     

    上記をNodeMouseHoverイベントに実装すると、以下のような感じになると思います。

     

    private void treeView1_NodeMouseHover(object sender, TreeNodeMouseHoverEventArgs e)
    {
    	this.treeView1.Focus();
    	this.treeView1.SelectedNode = e.Node;
    }
    
    

    • 回答としてマーク 山本春海 2010年10月28日 8:09
    2010年10月22日 6:43
  • ちなみに、TreeViewで選択した要素が子要素を持っている場合に自動で展開したい

    場合は、以下のような感じで出来ます。

     

    private void treeView1_NodeMouseHover(object sender, TreeNodeMouseHoverEventArgs e)
    {
    	this.treeView1.Focus();
    	this.treeView1.SelectedNode = e.Node;
    	if (e.Node.Nodes.Count != 0)
    	{
    		if (!e.Node.IsExpanded)
    		{
    			e.Node.Expand();
    		}
    	}
    }
    
    

    • 回答としてマーク 山本春海 2010年10月28日 8:09
    2010年10月22日 6:56
  • honefai様、

    大変参考になりました。この方法で今回の私の問題点(TreeView内で、マウス右クリックだけではそのノードの色が変わらないー実際は選択されている)の」回避を試してみます。

    ありがとうございました。

    2010年10月24日 9:38
  • honefai様、

    TreeViewにNodeMouseHover()を付け加えるだけで、このノードの色を変える問題は解決しました。アドバイスありがとうございました。

    2010年10月24日 9:58
  • こんにちは、DFusionTF さん。

    MSDN フォーラムのご利用ありがとうございます。フォーラム オペレーターの山本です。

    honefai さんからの情報が参考になったようでしたので、私のほうで回答としてマークさせていただきました。
    honefai さん、情報ありがとうございました。

    解決に役立った情報や、参考になった情報には、有効な情報として回答としてマークすることをお願いしています。
    今後、同じ問題でこのスレッドを参照される方にも、参考になる有効な情報がわかりやすくなるかと思いますので、回答としてマークのご協力よろしくお願いいたしますね。

    今後とも、MSDN フォーラムのご利用よろしくお願いいたしますね。それでは。
                                                                          
    マイクロソフト株式会社 MSDN フォーラム オペレーター 山本 春海

    2010年10月28日 8:09