문제

상황에 맞는 메뉴가 활성화된 트리 목록의 노드를 어떻게 알 수 있나요?예를 들어 노드를 마우스 오른쪽 버튼으로 클릭하고 메뉴에서 옵션을 선택합니다.

TreeViews를 사용할 수 없습니다. SelectedNode 속성은 노드를 마우스 오른쪽 버튼으로 클릭하기만 하고 선택하지 않았기 때문입니다.

도움이 되었습니까?

해결책

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);
        }
    }
}

다른 팁

내 해결책은 다음과 같습니다.TreeView의 NodeMouseClick 이벤트에 다음 줄을 입력하세요.

 ((TreeView)sender).SelectedNode = e.Node;

나는 표준 Windows 트리뷰 동작 선택 동작이 매우 짜증스럽다고 생각합니다.예를 들어, Explorer를 사용하고 노드를 마우스 오른쪽 버튼으로 클릭하고 속성을 누르면 해당 노드가 강조 표시되고 클릭한 노드에 대한 속성 대화 상자가 표시됩니다.그러나 대화상자에서 돌아오면 강조 표시된 노드는 마우스 오른쪽 버튼을 클릭하기 전에 이전에 선택/강조 표시된 노드였습니다.나는 올바른 노드에서 작업했는지에 대해 영원히 혼란스러워하기 때문에 이것이 유용성 문제를 일으킨다는 것을 알았습니다.

따라서 많은 GUI에서는 혼동이 없도록 마우스 오른쪽 버튼 클릭으로 선택한 트리 노드를 변경합니다.이는 Explorer와 같은 표준 iwndos 앱과 동일하지 않을 수 있습니다(그리고 저는 사용성상의 이유로 표준 창 앱 이후에 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 );
           }
        }
     }
  }

이것이 훨씬 더 나은 해결책이라고 생각하기 때문에 이 질문을 다시 사용합니다.나는 NodeMouseClick 대신 이벤트.

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

Marcus의 답변과 유사하게 이것이 제가 찾은 솔루션이었습니다.

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 속성이 올바른 노드를 반영합니다.

이것은 매우 오래된 질문이지만 여전히 유용하다고 생각합니다.마우스 오른쪽 버튼을 클릭한 노드가 selectedNode가 되는 것을 원하지 않기 때문에 위의 답변 중 일부를 조합하여 사용하고 있습니다.루트 노드가 선택되어 있고 그 자식 중 하나를 삭제하려는 경우 삭제할 때 자식이 선택되는 것을 원하지 않습니다. (또한 오른쪽에서 발생하고 싶지 않은 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);
}

상황에 맞는 메뉴가 선택한 항목에 종속되도록 하려면 Jonesinator의 코드를 사용하여 클릭한 항목을 선택하는 것이 가장 좋습니다.그러면 상황에 맞는 메뉴 내용이 선택한 항목에 따라 달라질 수 있습니다.

상황에 맞는 메뉴에 항목을 사용하는 대신 항목을 먼저 선택하면 몇 가지 이점이 있습니다.첫 번째는 사용자가 자신이 클릭한 항목과 메뉴가 연결된 항목에 대한 시각적 표시가 있다는 것입니다.두 번째는 이 방법을 사용하면 상황에 맞는 메뉴를 호출하는 다른 방법(예:키보드 단축키).

내가하는 방법은 다음과 같습니다.

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

실행할 수 있는 또 다른 옵션은 선택한 노드가 있는 전역 변수를 갖는 것입니다.당신은 단지 TreeNodeMouseClickEventArgs.

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

이제 해당 노드와 해당 속성에 액세스할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top