2008-08-05 2 views
61

ツリーリストのどのノードがコンテキストメニューがアクティブになっているかをどのようにして知ることができますか?例えば、ノードを右クリックし、メニューからオプションを選択する。コンテキストメニューの下でクリックしたノードの検索

ノードが右クリックされ、選択されていないため、TreeViewsのSelectedNodeプロパティは使用できません。

答えて

83

MouseClickイベントをTreeViewに追加し、MouseEventArgsによって提供されるマウス座標を指定してGetNodeAtを使用して正しいノードを選択できます。

void treeView1MouseUp(object sender, MouseEventArgs e) 
{ 
    if(e.Button == MouseButtons.Right) 
    { 
     // Select the clicked node 
     treeView1.SelectedNode = treeView1.GetNodeAt(e.X, e.Y); 

     if(treeView1.SelectedNode != null) 
     { 
      myContextMenuStrip.Show(treeView1, e.Location); 
     } 
    } 
} 
+4

大変ありがとうございます。 「TreeNodeMouseClickEventArgs e」を提供する「_NodeMouseClick」イベントを使用することもできます。この場合、e.Nodeを使用するだけで、ノードがヌルであるかどうかをチェックすることに気をつける。 – SDM

+0

MouseUpの代わりにMouseDownイベントで目的の結果が得られました。 – Javier

0

コンテキストメニューを選択したアイテムに依存させたい場合は、私はJonesinatorのコードを使用してクリックしたアイテムを選択することをお勧めします。コンテキストメニューの内容は、選択した項目に依存することがあります。

コンテキストメニューで使用するのではなく、最初に項目を選択すると、いくつかの利点があります。第1の問題は、ユーザがクリックしたときの視覚的な表示と、メニューが関連付けられているアイテムの視覚的な表示があることです。もう1つは、コンテキストメニューを呼び出す他のメソッド(キーボードショートカットなど)との互換性を保つのがずっと簡単なことです。

11

私は、標準的なウィンドウツリービューの動作選択動作が非常に面倒であることがわかりました。たとえば、Explorerを使用してノードを右クリックしてPropertiesを押すと、ノードが強調表示され、クリックしたノードのプロパティダイアログが表示されます。しかし、ダイアログから戻ると、強調表示されたノードは、右クリックを行う前に以前に選択/強調表示されたノードでした。私は正しいノードで動作しているかどうか私は永遠に混乱しているので、これはユーザビリティの問題を引き起こすことがわかります。

私たちのGUIの多くでは、右クリックで選択したツリーノードを変更して、混乱のないようにしています。これはエクスプローラのような標準的なiwndosアプリケーションと同じではないかもしれません(私はusabiltiyの理由で標準のウィンドウアプリケーションの後でGUIの動作を強くモデル化する傾向があります)。ここで

は、右クリック時に選択を変更し、いくつかのコードです:ここでは

private void tree_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) 
    { 
    // only need to change selected note during right-click - otherwise tree does 
    // fine by itself 
    if (e.Button == MouseButtons.Right) 
    {   
     Point pt = new Point(e.X, e.Y); 
     tree.PointToClient(pt); 

     TreeNode Node = tree.GetNodeAt(pt); 
     if (Node != null) 
     { 
      if (Node.Bounds.Contains(pt)) 
      { 
       tree.SelectedNode = Node; 
       ResetContextMenu(); 
       contextMenuTree.Show(tree, pt); 
      } 
     } 
    } 
    } 
+0

これは実際にクリックしたノードを選択するため、私にとって最適なソリューションです。 –

18

は私のソリューションです。ツリービューのNodeMouseClickイベントに次の行を入れて:

Marcusの答えと同様に
((TreeView)sender).SelectedNode = e.Node; 
+0

マウスイベントのargsに.Node –

+2

はありません(ただし、** NodeMouseClick **イベントに渡される)TreeNodeMouseClickEventArgsはそうです。だから私の解決策は働いていて、他のいくつかの解決策のように複雑すぎることはありません。 – deej

+1

ニースとシンプル – AndrewJE

2

、これは私が見つけた解決策だった私の仕事:あなたがいる場合、コンテキストメニューを自分で表示されていない必要

private void treeView_MouseClick(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Right) 
    { 
     treeView.SelectedNode = treeView.GetNodeAt(e.Location); 
    } 
} 

そのような個々のノードに設定します。

TreeNode node = new TreeNode(); 
node.ContextMenuStrip = contextMenu; 

その後のContextMenuのオープニングイベント内で、TreeView.SelectedNodeプロパティが正しいノードに反映されます。

6

私はこれがずっと良い解決策であると考えているので、この質問を復活させてください。 私は代わりにNodeMouseClickイベントを使用します。

void treeview_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) 
{ 
    if(e.Button == MouseButtons.Right) 
    { 
     tree.SelectedNode = e.Node; 
    } 
} 
+0

私と同じ=) – deej

+0

私はこれもずっとよく似ています。 –

0

これはどのように行うのですか。

private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) 
{ 
    if (e.Button == System.Windows.Forms.MouseButtons.Right) 
     e.Node.TreeView.SelectedNode = e.Node; 
} 
2

これは非常に古い質問ですが、私はまだそれが有用であることを発見しました。右クリックしたノードをselectedNodeにしたくないので、私は上記の答えのいくつかの組み合わせを使用しています。ルートノードが選択されていて、子ノードの1つを削除したい場合は、削除するときに子ノードを選択しないようにします(selectedNodeでいくつかの作業をしていますが、クリック)。ここに私の貢献があります:

// Global Private Variable to hold right-clicked Node 
private TreeNode _currentNode = new TreeNode(); 

// Set Global Variable to the Node that was right-clicked 
private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) 
{ 
    if (e.Button == System.Windows.Forms.MouseButtons.Right) 
     _currentNode = e.Node; 
} 

// Do something when the Menu Item is clicked using the _currentNode 
private void toolStripMenuItem_Clicked(object sender, EventArgs e) 
{ 
    if (_currentNode != null) 
     MessageBox.Show(_currentNode.Text); 
} 
0

実行可能な別のオプションは、選択したノードを持つグローバル変数を持つことです。 TreeNodeMouseClickEventArgsを使用するだけです。

public void treeNode_Click(object sender, TreeNodeMouseClickEventArgs e) 
{ 
    _globalVariable = e.Node; 
} 

これで、そのノードとそのプロパティにアクセスできます。

関連する問題