Trova nodo cliccato sotto menu contestuale

voti
61

Come faccio a sapere quale nodo in un elenco albero è stato attivato il menu di scelta rapida? Per esempio clic destro su un nodo e selezionando un'opzione dal menu.

Non posso usare i TreeViews' SelectedNodeproprietà, perché il nodo è stato solo click destro e non selezionato.

È pubblicato 05/08/2008 alle 17:21
fonte dall'utente
In altre lingue...                            


9 risposte

voti
83

È possibile aggiungere un evento click del mouse per il controllo TreeView, quindi selezionare il nodo corretto utilizzando GetNodeAt dato il mouse coordinate fornite dalle 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);
        }
    }
}
Risposto il 05/08/2008 a 17:36
fonte dall'utente

voti
19

Ecco la mia soluzione. Metti questa linea nel NodeMouseClick caso di TreeView:

 ((TreeView)sender).SelectedNode = e.Node;
Risposto il 09/12/2010 a 00:05
fonte dall'utente

voti
11

Trovo la vista ad albero di Windows comportamento di selezione comportamento standard per essere abbastanza fastidioso. Ad esempio, se si utilizza Explorer e fare clic destro su un nodo e colpire Proprietà, mette in evidenza il nodo e mostra la finestra delle proprietà per il nodo si è fatto clic su. Ma quando si torna dalla finestra di dialogo, il nodo evidenziato era il nodo precedentemente selezionato / evidenziato prima di te il tasto destro del mouse. Trovo che questo provoca problemi di usabilità perché sono sempre di essere confuso dal fatto che ho agito sul nodo destra.

Così in molte delle nostre interfacce grafiche, cambiamo il nodo della struttura selezionata sul tasto destro del mouse in modo che non ci sia confusione. Questo non può essere lo stesso di un app iwndos standard quali Explorer (e tendo a modellare con forza il nostro comportamento GUI dopo applicazioni standard della finestra per motivi usabiltiy), credo che questo caso una sola eccezione si traduce in ben alberi più utilizzabile.

Ecco un po 'di codice che cambia la selezione durante il tasto destro del mouse:

  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 );
           }
        }
     }
  }
Risposto il 11/12/2008 a 22:10
fonte dall'utente

voti
6

Rilanciare questa domanda, perché trovo che questa sia una soluzione molto migliore. Io uso il NodeMouseClickposto dell'evento.

void treeview_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if( e.Button == MouseButtons.Right )
    {
        tree.SelectedNode = e.Node;
    }
}
Risposto il 02/01/2013 a 20:41
fonte dall'utente

voti
2

Questa è una domanda molto vecchio, ma ho ancora trovato utile. Sto usando una combinazione di alcune delle risposte di cui sopra, perché io non voglio che il nodo di destra-clic per diventare il selectedNode. Se ho il nodo principale selezionato e voglio eliminare uno dei suoi figli, non voglio che il bambino selezionato quando elimino esso (Sto anche facendo un lavoro sul selectedNode che io non voglio che accada su una destra clic). Qui è il mio contributo:

// 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);
}
Risposto il 06/12/2016 a 19:42
fonte dall'utente

voti
2

Simile alla risposta di Marcus', questa era la soluzione che ho trovato lavorato per me:

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

Non è necessario mostrare il menu di scelta rapida da soli se lo si imposta per ogni singolo nodo in questo modo:

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

Poi all'interno Evento di apertura del ContextMenu, la proprietà TreeView.SelectedNode rifletterà il nodo corretto.

Risposto il 21/11/2012 a 23:10
fonte dall'utente

voti
0

Un'altra opzione è possibile eseguire con è quello di avere una variabile globale che ha il nodo selezionato. Si sarebbe solo bisogno di usare il TreeNodeMouseClickEventArgs.

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

Ora si ha accesso a quel nodo e le sue proprietà.

Risposto il 12/12/2016 a 20:30
fonte dall'utente

voti
0

Ecco come lo faccio.

private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Right)
        e.Node.TreeView.SelectedNode = e.Node;
}
Risposto il 29/05/2014 a 23:11
fonte dall'utente

voti
0

Se si desidera che il menu contestuale di essere dipendente dalla voce selezionata sei mossa migliore credo è quello di utilizzare il codice di Jonesinator per selezionare la voce cliccato. Il tuo contenuto menu di contesto può quindi dipendere l'elemento selezionato.

Selezionando la voce prima in contrapposizione a solo usarlo per il menu di contesto dà alcuni vantaggi. La prima è che l'utente ha un'indicazione visiva da cui ha cliccato e quindi quale voce del menu è associato. La seconda è che in questo modo è un inferno di molto più facile per tenere compatibile con altri metodi di invocare il menu di contesto (ad esempio le scorciatoie da tastiera).

Risposto il 08/08/2008 a 15:04
fonte dall'utente

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