2011-12-16 9 views
3

私はTreeNodesの束を持つTreeViewコントロールを持っています。各ノードContextMenuには、その状態に基づいて異なるMenuItemがあります。だから私は現在、各TreeNode独自のContextMenuを添付しています。コンテキストメニューが呼び出されたTreeNodeを取得するにはどうすればよいですか?

TreeView tv = new TreeView(); 
TreeNode tn = New TreeNode(); 
tn.ContextMenu = GetContextMenu(state); 
tv.Nodes.Add(tn); 

次に、MenuItemのクリックイベントで、ContextMenuが属するTreeNodeを取得しようとします。

MenuItem mi = (MenuItem)sender; 
ContextMenu tm = mi.GetContextMenu(); 
var sc = tm.SourceControl; 

問題はtm.SourceControl == nullです。私はTreeNodeControlから派生していないことに気づいた。それがSourceControlプロパティがnullであるのはなぜですか?適切なTreeNodeオブジェクトを取得するにはどうすればよいですか?またはTreeViewオブジェクトですか?

+0

は、あなたがこのStackOverflowの前のポストを見て見ることはできますが/ questions/2527/c-sharp-treeview-context-menus – MethodMan

+0

これは助けになりました。私は私の検索でそれを見ませんでした。ありがとう。この質問で私は何をしますか? – scott

答えて

2

あなたの質問を理解できません。

ツリービュー上でクリックを持っているときは、選択したノードおよび取得するには、この操作を行うことができます。それはhttp://stackoverflow.com場合に役立ちます

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

     if(tv.SelectedNode != null) 
     { 
      myContextMenuStrip.Show(tv, e.Location) 
     } 
    } 
} 
+0

私はMenuItemクリックイベントを使用していたTreeViewのクリックイベントを使用していませんでした。しかし、これは私の解決策を理解するのに役立ちました。ツリービューは常に利用可能であり、ツリービューは1つしかありません。だから私はイベントハンドラのパラメータから取得しようとするのではなく、直接アクセスするだけです。 – scott