Znajdź węzeł kliknięty w menu kontekstowym

Jak mogę sprawdzić, który węzeł na liście drzewa został aktywowany przez menu kontekstowe? Na przykład kliknięcie prawym przyciskiem myszy węzła i wybranie opcji z menu.

Nie mogę użyć właściwości TreeViews' SelectedNode, ponieważ węzeł został tylko kliknięty prawym przyciskiem myszy i nie wybrany.

Author: Sebastian Negraszus, 2008-08-05

9 answers

Możesz dodać zdarzenie kliknięcia myszką do widoku drzewa, a następnie wybrać właściwy węzeł za pomocą GetNodeAt, biorąc pod uwagę współrzędne myszy dostarczone przez MouseEventArgs.

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);
        }
    }
}
 83
Author: Jonesinator,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-11 05:38:54

Oto moje rozwiązanie. Umieść tę linię w zdarzeniu Nodemouseclick drzewa:

 ((TreeView)sender).SelectedNode = e.Node;
 19
Author: deej,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-08 23:05:57

Uważam, że standardowe zachowanie wybierania zachowania drzewa Windows jest dość irytujące. Na przykład, jeśli używasz Eksploratora i klikasz prawym przyciskiem myszy węzeł i trafiasz w właściwości, podświetli węzeł i wyświetli okno dialogowe Właściwości dla węzła, na który kliknąłeś. Ale po powrocie z okna dialogowego podświetlony węzeł był węzłem wcześniej zaznaczonym/podświetlonym przed kliknięciem prawym przyciskiem myszy. Uważam, że powoduje to problemy z użytecznością, ponieważ na zawsze jestem zdezorientowany, czy działałem na prawy węzeł.

Tak więc w wielu naszych GUI zmieniamy wybrany węzeł drzewa klikając prawym przyciskiem myszy, aby nie było zamieszania. Może to nie być to samo, co standardowa aplikacja iwndos jak Explorer (i mam tendencję do silnie modelować nasze zachowanie GUI po standardowych aplikacji okien dla usabiltiy powodów), uważam, że ten jeden przypadek wyjątku powoduje znacznie więcej użytecznych drzew.

Oto kod, który zmienia zaznaczenie podczas kliknięcia prawym przyciskiem myszy:

  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 );
           }
        }
     }
  }
 12
Author: Marcus Erickson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-15 00:53:58

Ożywiam to pytanie, ponieważ uważam, że jest to o wiele lepsze rozwiązanie. Zamiast tego używam zdarzenia NodeMouseClick.

void treeview_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if( e.Button == MouseButtons.Right )
    {
        tree.SelectedNode = e.Node;
    }
}
 6
Author: Beta Carotin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-02 19:41:00

Podobne do odpowiedzi Marcusa, takie rozwiązanie znalazłem dla mnie:

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

Nie musisz pokazywać menu kontekstowego samodzielnie, jeśli ustawisz je na każdym pojedynczym węźle w ten sposób:

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

Następnie wewnątrz wydarzenia otwierającego ContextMenu, TreeView.Właściwość SelectedNode będzie odzwierciedlać właściwy węzeł.

 2
Author: Trevor Elliott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-21 22:10:51

To bardzo stare pytanie, ale nadal uważam je za przydatne. Używam kombinacji niektórych z powyższych odpowiedzi, ponieważ nie chcę, aby węzeł kliknięty prawym przyciskiem stał się selectedNode. Jeśli mam wybrany węzeł główny i chcę usunąć jedno z jego dzieci, nie chcę, aby dziecko zostało wybrane, gdy go usuwam(wykonuję również pewną pracę nad selectedNode, której nie chcę robić po kliknięciu prawym przyciskiem myszy). Oto mój wkład:

// 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);
}
 2
Author: George,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-06 19:42:55

Jeśli chcesz, aby menu kontekstowe było zależne od wybranego elementu najlepiej przenieść myślę, że jest użycie kodu Jonesinatora do wybrania klikniętego elementu. Zawartość menu kontekstowego może być zależna od wybranego elementu.

Wybór elementu jako pierwszy, a nie tylko użycie go w menu kontekstowym daje kilka zalet. Pierwszym jest to, że użytkownik ma wizualne wskazanie, do którego kliknął, a tym samym, który element menu jest powiązany z. Druga jest taka, że w ten sposób to piekło o wiele łatwiej jest zachować kompatybilność z innymi metodami wywoływania menu kontekstowego (np. skróty klawiaturowe).

 0
Author: ICR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-08 14:04:11

Oto Jak to robię.

private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Right)
        e.Node.TreeView.SelectedNode = e.Node;
}
 0
Author: Ricky Manwell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-29 22:11:10

Inną opcją, którą możesz uruchomić, jest posiadanie zmiennej globalnej, która ma wybrany węzeł. Wystarczy użyć TreeNodeMouseClickEventArgs.

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

Teraz masz dostęp do tego węzła i jego właściwości.

 0
Author: sparkyShorts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-12 20:30:56