Vind knooppunt geklikt onder contextmenu

stemmen
61

Hoe kan ik erachter welke knoop in een boom lijst het contextmenu is geactiveerd? Bijvoorbeeld de rechtermuisknop op een knooppunt en een optie in het menu te selecteren.

Ik kan het treeviews' geen gebruik van SelectedNodeeigendom, omdat het knooppunt enige juiste geklikt en niet geselecteerd is geweest.

De vraag is gesteld op 05/08/2008 om 17:21
bron van user
In andere talen...                            


9 antwoorden

stemmen
83

U kunt een muisklik evenement toe te voegen aan de TreeView, selecteer vervolgens de juiste knooppunt met behulp van GetNodeAt gezien de muiscoördinaten door de 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);
        }
    }
}
antwoordde op 05/08/2008 om 17:36
bron van user

stemmen
19

Hier is mijn oplossing. Zet deze lijn in NodeMouseClick evenement van het TreeView:

 ((TreeView)sender).SelectedNode = e.Node;
antwoordde op 09/12/2010 om 00:05
bron van user

stemmen
11

Ik vind de standaard Windows-boomstructuur gedrag selectie gedrag heel vervelend zijn. Bijvoorbeeld, als u gebruik maakt Explorer en klik met de rechtermuisknop op een knooppunt en druk op Properties, wijst hij op het knooppunt en toont het dialoogvenster Eigenschappen voor het knooppunt waarop u hebt geklikt. Maar als je terug komt van de dialoog, de gemarkeerde knooppunt was het knooppunt eerder geselecteerde / gemarkeerde voordat je deed de klik met de rechtermuisknop. Ik vind dit veroorzaakt usability problemen, want ik ben altijd in de war over de vraag of ik handelde op de juiste knooppunt.

Dus in veel van onze GUI's, veranderen we de geselecteerde boom knooppunt op een klik met de rechtermuisknop, zodat er geen verwarring. Dit is misschien niet hetzelfde als een standaard iwndos app zoals Explorer (en ik de neiging om sterk te modelleren onze GUI gedrag na standaard venster apps voor usabiltiy redenen), ik denk dat dit één uitzondering geval resulteert in veel meer bruikbare bomen.

Hier is een code die de selectie tijdens de rechter muisknop verandert:

  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 );
           }
        }
     }
  }
antwoordde op 11/12/2008 om 22:10
bron van user

stemmen
6

Hervatting van deze vraag, omdat ik vind dat dit een veel betere oplossing zijn. Ik gebruik de NodeMouseClickgebeurtenis plaats.

void treeview_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if( e.Button == MouseButtons.Right )
    {
        tree.SelectedNode = e.Node;
    }
}
antwoordde op 02/01/2013 om 20:41
bron van user

stemmen
2

Dit is een heel oude vraag, maar ik vond het nog steeds nuttig. Ik gebruik een combinatie van een aantal van de bovenstaande antwoorden, want ik wil niet dat het klikte knooppunt naar het selectedNode worden. Als ik de wortel knooppunt geselecteerd en wil een van het te verwijderen van kinderen, ik wil niet dat de geselecteerde toen Ik schrap het kind (ben ik ook doen wat werk op de selectedNode dat ik niet willen dat er gebeurt op een rechts- Klik). Hier is mijn bijdrage:

// 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);
}
antwoordde op 06/12/2016 om 19:42
bron van user

stemmen
2

Net als bij Marcus' antwoord, was dit de oplossing vond ik werkte voor mij:

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

U hoeft niet te tonen in het contextmenu je voor dat je het aan op elk afzonderlijk knooppunt als volgt:

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

Dan in de ContextMenu's Opening evenement, zal het pand TreeView.SelectedNode de juiste knooppunt weer te geven.

antwoordde op 21/11/2012 om 23:10
bron van user

stemmen
0

Een andere optie die je zou kunnen lopen met is om een globale variabele die de geselecteerde node hebben. Je zou hoeft alleen maar naar de gebruiken TreeNodeMouseClickEventArgs.

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

Nu heb je toegang tot dat knooppunt en het is eigenschappen.

antwoordde op 12/12/2016 om 20:30
bron van user

stemmen
0

Hier is hoe ik het doe.

private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Right)
        e.Node.TreeView.SelectedNode = e.Node;
}
antwoordde op 29/05/2014 om 23:11
bron van user

stemmen
0

Als u wilt dat het contextmenu om afhankelijk van de optie die is geselecteerd kun je het beste beweging die ik denk dat is te Jonesinator de code gebruiken om de aangeklikte item te selecteren. Uw context menu-inhoud kan dan afhankelijk van de optie die is geselecteerd.

Het selecteren van het item eerste in tegenstelling tot alleen te gebruiken voor de context menu biedt een paar voordelen. De eerste is dat de gebruiker een visuele indicatie aan welke hij geklikt en dus welk item in het menu is gekoppeld. De tweede is dat op deze manier is het een hel van een stuk gemakkelijker compatibel met andere methoden van het aanroepen van de context menu (bijv sneltoetsen) te houden.

antwoordde op 08/08/2008 om 15:04
bron van user

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