Finn node klikket under hurtigmenyen

stemmer
62

Hvordan kan jeg finne ut hvilken node i et tre liste kontekstmenyen er aktivert? For eksempel høyreklikke på en node og velge et alternativ fra menyen.

Jeg kan ikke bruke treeviews' SelectedNodeeiendom fordi noden bare vært høyreklikkes og ikke valgt.

Publisert på 05/08/2008 klokken 16:21
kilden bruker
På andre språk...                            


9 svar

stemmer
83

Du kan legge til et museklikk hendelse til Treeview, deretter velger du riktig node bruker GetNodeAt gitt musen koordinerer levert av 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);
        }
    }
}
Svarte 05/08/2008 kl. 16:36
kilden bruker

stemmer
19

Her er min løsning. Sett denne linjen inn NodeMouseClick tilfelle av Treeview:

 ((TreeView)sender).SelectedNode = e.Node;
Svarte 08/12/2010 kl. 23:05
kilden bruker

stemmer
12

Jeg finner den standard Windows Utforsker atferd utvalg atferd for å være ganske irriterende. For eksempel, hvis du bruker Explorer og høyreklikk på en node og traff Properties, fremhever den noden og viser egenskapsdialogen for noden du klikket på. Men når du kommer tilbake fra dialogen, den markerte node var noden tidligere valgte / uthevet før du gjorde høyreklikk. Jeg finner dette fører usability problemer fordi jeg alltid blir forvirret på om jeg handlet på høyre node.

Så i mange av våre GUI, endrer vi valgte treet node på et høyreklikk, slik at det er ingen forvirring. Dette kan ikke være det samme som en standard iwndos app som Explorer (og jeg har en tendens til sterkt modellere vår GUI oppførsel etter standard vindus apps for usabiltiy grunner), jeg tror at dette unntaket saken resulterer i langt mer brukbare trær.

Her er noen kode som endrer utvalget under høyreklikk:

  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 );
           }
        }
     }
  }
Svarte 11/12/2008 kl. 21:10
kilden bruker

stemmer
6

Gjenopplive dette spørsmålet fordi jeg synes dette er en mye bedre løsning. Jeg bruker NodeMouseClickhendelsen i stedet.

void treeview_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if( e.Button == MouseButtons.Right )
    {
        tree.SelectedNode = e.Node;
    }
}
Svarte 02/01/2013 kl. 19:41
kilden bruker

stemmer
2

Dette er en svært gammel spørsmålet, men jeg likevel funnet det nyttig. Jeg bruker en kombinasjon av noen av svarene ovenfor, fordi jeg ikke vil at høyreklikket node å bli selectedNode. Hvis jeg har rotnoden valgt og ønsker å slette en av det barn, jeg vil ikke ha valgt når jeg sletter det barnet (jeg også gjør noe arbeid på selectedNode at jeg ikke vil skal skje på en høyre- klikk). Her er mitt bidrag:

// 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);
}
Svarte 06/12/2016 kl. 19:42
kilden bruker

stemmer
2

I likhet med Marcus' svar, dette var den løsningen jeg fant jobbet for meg:

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

Du trenger ikke vise kontekstmenyen selv om du setter den til hver enkelt node som så:

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

Deretter inne i contextmenu åpnings hendelse, vil TreeView.SelectedNode eiendom reflekterer den riktige noden.

Svarte 21/11/2012 kl. 22:10
kilden bruker

stemmer
0

Et annet alternativ du kan kjøre med er å ha en global variabel som har valgt node. Du ville bare trenger å bruke den TreeNodeMouseClickEventArgs.

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

Nå har du tilgang til den noden, og det er egenskaper.

Svarte 12/12/2016 kl. 20:30
kilden bruker

stemmer
0

Her er hvordan jeg gjør det.

private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Right)
        e.Node.TreeView.SelectedNode = e.Node;
}
Svarte 29/05/2014 kl. 22:11
kilden bruker

stemmer
0

Hvis du ønsker kontekstmenyen for å være avhengig av det valgte elementet du er beste trekket tror jeg er å bruke Jonesinator kode for å velge klikket elementet. Din kontekstmenyen innholdet kan da være avhengig av det valgte elementet.

Velge elementet først i motsetning til bare å bruke den for hurtigmenyen gir noen fordeler. Den første er at brukeren har en visuell indikasjon på hvor han klikket og dermed hvilket element på menyen er forbundet med. Det andre er at denne måten er det en helvetes mye lettere å holde kompatibel med andre metoder for å påkalle kontekstmenyen (f.eks hurtigtaster).

Svarte 08/08/2008 kl. 14:04
kilden bruker

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