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

głosy
61

Jak mogę się dowiedzieć, który w liście drzewa węzeł menu kontekstowe zostało aktywowane? Na przykład kliknięcie prawym przyciskiem myszy węzeł i wybierając opcję z menu.

Nie można używać treeviews' SelectedNodewłaściwość, ponieważ węzeł jest dopiero prawym klawiszem myszy, a nie wybrana.

Utwórz 05/08/2008 o 17:21
źródło użytkownik
W innych językach...                            


9 odpowiedzi

głosy
83

Możesz dodać zdarzenie myszy, aby TreeView, a następnie wybrać właściwy węzeł używając GetNodeAt podane 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);
        }
    }
}
Odpowiedział 05/08/2008 o 17:36
źródło użytkownik

głosy
0

Jeśli chcesz, aby menu kontekstowego, aby być uzależniona od wybranego elementu jesteś najlepsza akcja myślę jest użycie kodu Jonesinator by wybrać element kliknięty. Zawartość menu kontekstowego mogą następnie być zależna od wybranej pozycji.

Wybierając element pierwszy, a nie tylko przy użyciu go do menu kontekstowego daje kilka korzyści. Pierwszym jest to, że użytkownik ma wizualną wskazówkę co do której kliknięty, a tym samym, który element menu jest skojarzony. Drugim jest to, że w ten sposób, że to cholernie dużo łatwiej utrzymać kompatybilny z innymi metodami wywoływania menu kontekstowe (np skrótów klawiaturowych).

Odpowiedział 08/08/2008 o 15:04
źródło użytkownik

głosy
11

Uważam średnia okna katalogów zachowanie wybór zachowanie się być dość irytujące. Na przykład, jeśli używasz Explorer i kliknij prawym przyciskiem myszy na węźle i uderzył Właściwości, to podkreśla węzeł i pokazuje właściwości dialogowe do węzła kliknął. Ale po powrocie z okna, zaznaczony węzeł węzeł był wcześniej wybrany / zaznaczony zanim zrobił prawym przyciskiem myszy. Uważam to powoduje problemy z użytecznością, bo ja zawsze mylone czy ja działał na prawym węźle.

Tak więc w wielu naszych GUI, możemy zmienić wybrany węzeł drzewa na prawym przyciskiem myszy, tak aby nie było wątpliwości. To nie może być takie samo jak app standardowych iwndos jak Explorer (i staram się mocno modelować nasze zachowanie po standardowym GUI aplikacji okiennych ze względów usabiltiy), uważam, że w tym przypadku jeden wyjątek skutkuje znacznie bardziej użyteczny drzew.

Oto kod, który zmienia wybór podczas 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 );
           }
        }
     }
  }
Odpowiedział 11/12/2008 o 22:10
źródło użytkownik

głosy
19

Oto moje rozwiązanie. Umieścić tę linię do NodeMouseClick przypadku TreeView:

 ((TreeView)sender).SelectedNode = e.Node;
Odpowiedział 09/12/2010 o 00:05
źródło użytkownik

głosy
2

Podobna do odpowiedzi Marcusa, było to rozwiązanie znalazłem pracował dla mnie:

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

Nie musisz pokazać menu kontekstowego sobie pytanie, czy ustawić go do każdego węzła tak:

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

Następnie wewnątrz przypadku otwierania contextMenu za właściwość TreeView.SelectedNode będzie odzwierciedlać właściwą węzła.

Odpowiedział 21/11/2012 o 23:10
źródło użytkownik

głosy
6

Ożywienie to pytanie, ponieważ uważam, że jest to o wiele lepsze rozwiązanie. Używam NodeMouseClickzdarzenie zamiast.

void treeview_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if( e.Button == MouseButtons.Right )
    {
        tree.SelectedNode = e.Node;
    }
}
Odpowiedział 02/01/2013 o 20:41
źródło użytkownik

głosy
0

Oto jak to zrobić.

private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Right)
        e.Node.TreeView.SelectedNode = e.Node;
}
Odpowiedział 29/05/2014 o 23:11
źródło użytkownik

głosy
2

Jest to bardzo stare pytanie, ale nadal znajduje się on przydatny. Używam kombinacji niektórych z powyższych odpowiedzi, ponieważ nie chcę węzeł prawym przyciskiem myszy, aby stać się selectedNode. Jeśli mam wybrany węzeł główny i usunąć jedną z niego to dzieci, nie chcę wybrana kiedy go usunąć dziecko (ja też robi pewne prace na selectedNode, że nie ma się wydarzyć w prawo- Kliknij). 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);
}
Odpowiedział 06/12/2016 o 19:42
źródło użytkownik

głosy
0

Inną opcją można uruchomić z ma mieć globalną zmienną, która ma wybranego węzła. Byłoby po prostu trzeba 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.

Odpowiedział 12/12/2016 o 20:30
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more