2012-08-27 4 views
0

나는 모든 부모의 TreeNode에 같은 ContextMenuStrip을 추가 다른 수준의 TreeNode
와 트 리뷰를하고 난 돈을 그 ContextMenuStrip을을 열고ToolStripMenuItem 클릭 핸들러에서 ContextMenuStrip을 연 TreeNode를 가져 오는 방법이 있습니까?

private void btn_delete_all_objects_Click(object sender, EventArgs e) 
{ 
    ToolStripMenuItem tsmi = (ToolStripMenuItem)sender; //that way i receive button "Delete all" 
    ContextMenuStrip cms = (ContextMenuStrip)tsmi.Owner; //this is ContextMenuStrip where this button... 
    TreeView tw = (TreeView)cms.SourceControl; //i can get TreeView :(BUT I NEED TreeNode! 
    TreeNode tn = tw.SelectedNode; //bah... if i select some of child nodes, then right click to open menu on parent, selected node is still that child 
} 

그리고 난 "을 모두 삭제"를 눌러 모든 자식의 TreeNode를 삭제 가능성을 얻으려면 사용자가 해당 메뉴를 열기 위해 클릭 한 TreeNode를 가져 오는 방법을 알 수 없음
아이디어가 있으십니까?

+1

당신은 노드를 가져옵니다. 이 노드를 변수에 저장하면 이벤트 핸들러에서이를 읽습니다. – Tomtom

+0

어느쪽으로? contextMenuStrip1_Opening 및 contextMenuStrip1_Opened ** 보낸 사람 **은 여전히 ​​ContextMenuStrip이지만 TreeNode가 아닙니다. – Kosmos

+0

treenode를 마우스로 클릭하면 treenode가 생깁니다. 이 유는 변수에 저장할 수 있습니다. 컨텍스트 메뉴에서 항목을 클릭하면 u가 노드를 포함하는 저장된 변수를 읽을 수 있습니다. – Tomtom

답변

4

당신은, 다음과 같이

var hitTest = treeView1.HitTest(treeView1.PointToClient(new Point(contextMenuStrip1.Left, contextMenuStrip1.Top))); 
if (hitTest.Node != null) 
{ 
    // Place your code to delete nodes 
} 

을 노드를 찾기 위해 트리 뷰에서 HitTest() 방법을 사용하거나 마우스를 클릭하여 메뉴 항목에서 조작 할 수 treeView1.SelectedNode 속성을 사용하는 노드를 집중할 수 있습니다. 이런 식으로 모든 상황에 맞는 메뉴 항목에서 HitTest()를 사용하지 않아도됩니다 ...

private void treeView1_MouseDown(object sender, MouseEventArgs e) 
{ 
    var hitTest = treeView1.HitTest(treeView1.PointToClient(e.Location)); 
    if (hitTest.Node != null) 
    { 
     treeView1.SelectedNode = hitTest.Node; 
    } 
} 
+0

이게 작동 중입니다! 덕분에 :)이게 정말 최선의 방법이라고 말할 수는 없지만 다른 방법이 없다면 ... – Kosmos

1

위의 코드로 무엇을하려하는지 명확하지 않습니다. 그러나 당신이 무엇을 필요로 할 그런 다음 설치 ContexMenu에서 클릭 이벤트가 선택

에 따라 모든 자식 노드를 삭제할 수 있습니다 (즉, 바로 TreeNode 클릭하고 특정 ContextMenuStrip을 시작)

private void customTreeViewSql_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) 
{ 
    // Ensure selected node is selected. 
    treeView.BeginUpdate(); 
    this.treeView.SelectedNode = e.Node; 
    try 
    { 
     if (e.Node.Level == 0) 
     { 
      if (e.Button == MouseButtons.Right) 
       contextMenuStripA.Show(MousePosition); 
     } 
     else if (e.Node.Level == 1) 
     { 
      if (e.Button == MouseButtons.Right) 
       contextMenuStripB.Show(MousePosition); 
     } 
    } 
    finally 
    { 
     this.treeView.EndUpdate(); 
    } 
} 

에 코드 simalar를 사용

private void toolStripMenuDeleteAll_Click(object sender, EventArgs e) 
{ 
    TreeNode treeNode = this.treeView.SelectedNode; 
    foreach (TreeNode n in treeNode.Nodes) 
     n.Remove(); 
} 

이 정보가 도움이되기를 바랍니다.

+0

도움을 주셔서 감사합니다,이게 내가 원한 것이 아니지만 여전히 ... ContextMenuStrip은 TreeNode를 클릭하면 자동으로 보여줍니다. ToolStripmenuItem 버튼을 누를 때 핸들러 TreeNode가 열리는 ContextMenuStrip을 얻는 방법이 필요합니다. – Kosmos

+0

위의 컨텍스트 버튼 클릭 이벤트가 즉시 발생하고 현재 선택된 노드에서 작동합니다. 이것은 당신이 필요로하는 것을해야합니다. – MoonKnight

2

나는 이것이 Krishnakumar의 코드보다 훨씬 명확하고 쉽다고 생각합니다. 'toolStripMenuDeleteAll'을 (를) 일부 treenode에만 설정할 수 있으며 모든 항목에 설정할 수는 없습니다. 이 코드는 선택한 TreeNode를 전혀 변경하지 않습니다.

환영 컨텍스트 메뉴가 표시됩니다 CHADASH

TreeNode LastClickedTreeNode; 
private void customTreeViewSql_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) 
{ 
    // update last treenode clicked. 
    LastClickedTreeNode = e.Node; 
} 

private void toolStripMenuDeleteAll_Click(object sender, EventArgs e) 
{ 
    foreach (TreeNode n in LastClickedTreeNode.Nodes) 
     n.Remove(); 
} 
+0

나는 아이디어를 얻었지만 ... 그것은 마우스 클릭에 의존한다. 노드는 키보드 화살표 키로 선택할 수 있습니다. – Kosmos