Vă mulțumim pentru susținere

Găsiți un nod pe care îl faceți clic în meniul contextual

Cum pot afla care dintre nodurile dintr-o lista de copaci a fost activat meniul contextual? De exemplu, faceți clic dreapta pe un nod și selectând o opțiune din meniu.

Nu pot folosi proprietatea SelectedNode a TreeViews deoarece nodul a fost doar clic-dreapta și nu a fost selectat.

0
adăugat editat

9 răspunsuri

Dacă doriți ca meniul contextual să fie dependent de elementul selectat, cel mai bine vă mișcați, cred că este să folosiți codul lui Jonesinator pentru a selecta elementul clicat. Conținutul meniului contextual poate apoi să depindă de elementul selectat.

Selectarea elementului în primul rând, spre deosebire de utilizarea acestuia pentru meniul contextual, oferă câteva avantaje. Primul este că utilizatorul are o indicație vizuală cu privire la care a făcut clic și, prin urmare, la care element este asociat meniul. Al doilea este că în acest fel este mult mai ușor să păstrați compatibilitatea cu alte metode de invocare a meniului contextual (de exemplu, comenzi rapide de la tastatură).

0
adăugat

Puteți adăuga un eveniment click de mouse pentru treeview, apoi selectați nodul corect folosind GetNodeAt dat coordonatele mouse-ul furnizat 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);
        }
    }
}
0
adăugat
Am obținut rezultatul dorit cu evenimentul MouseDown în loc de MouseUp.
adăugat autor Javier
Mulțumesc foarte mult, am un mic plus pentru soluție: ai putea utiliza și evenimentul "_NodeMouseClick" care îți oferă un "TreeNodeMouseClickEventArgs e", caz în care poți folosi e.Node și nu trebuie să te deranjezi cu verificarea când nodul este nul sau nu.
adăugat autor SDM

Similar răspunsului lui Marcus, aceasta a fost soluția pe care am găsit-o pentru mine:

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

Nu trebuie să afișați singur meniul contextual dacă îl setați fiecărui nod individual astfel:

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

Apoi, în interiorul evenimentului Opening ContextMenu, proprietatea TreeView.SelectedNode va reflecta nodul corect.

0
adăugat

Revenind la această întrebare, consider că aceasta este o soluție mult mai bună. Folosesc în schimb evenimentul NodeMouseClick .

void treeview_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if( e.Button == MouseButtons.Right )
    {
        tree.SelectedNode = e.Node;
    }
}
0
adăugat
la fel ca a mea =)
adăugat autor deej
Îmi place mult și mai bine.
adăugat autor Joey Novak

Consider că comportamentul de selectare a comportamentului de comportament de tip treeview pentru Windows este destul de enervant. De exemplu, dacă utilizați Explorer și faceți clic dreapta pe un nod și apăsați Proprietăți, acesta evidențiază nodul și afișează dialogul de proprietăți pentru nodul pe care ați făcut clic. Dar când reveniți din dialog, nodul evidențiat a fost nodul selectat / evidențiat anterior înainte de a face clic dreapta. Consider că acest lucru cauzează probleme de uzabilitate, pentru că am fost întotdeauna confuz în ceea ce privește dacă am acționat pe nodul drept.

Deci, în multe dintre GUI-urile noastre, schimbăm nodul copac selectat printr-un clic dreapta, astfel încât să nu existe confuzie. Aceasta poate să nu fie aceeași cu o aplicație iwndos standard, cum ar fi Explorer (și am tendința de a modela puternic comportamentul GUI după aplicațiile standard de ferestre din motive utile), cred că acest caz excepțional are ca rezultat copaci mult mai utilizabili.

Iată un cod care modifică selecția în timpul clicului drept:

  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 );
           }
        }
     }
  }
0
adăugat
Aceasta este cea mai bună soluție pentru mine deoarece selectează de fapt nodul pe care ai făcut clic.
adăugat autor CAD bloke

Aici este soluția mea. Puneți această linie în evenimentul NodeMouseClick din TreeView:

 ((TreeView)sender).SelectedNode = e.Node;
0
adăugat
Frumos și simplu
adăugat autor AndrewJE
Arborele evenimentului mouse-ului nu are .Node
adăugat autor CAD bloke
Da, dar TreeNodeMouseClickEventArgs (care sunt transmise în eveniment NodeMouseClick ). Deci, soluția mea funcționează și nu este prea complicată ca și alte soluții
adăugat autor deej
noul tău erou.
adăugat autor garaber

Iată cum o fac eu.

private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Right)
        e.Node.TreeView.SelectedNode = e.Node;
}
0
adăugat

Aceasta este o întrebare foarte veche, dar totuși am găsit-o utilă. Folosesc o combinație a unora dintre răspunsurile de mai sus, pentru că nu vreau ca nodul cu clic-dreapta să devină Nodul selectat. Dacă am selectat nodul rădăcină și vreau să îl șterg pe unul dintre copiii lui, nu vreau ca copilul să fie selectat când îl șterg (mai fac și ceva lucrul pe Nodul selectat că nu vreau să se întâmple într-o fereastră dreapta- clic). Iată contribuția mea:

// 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);
}
0
adăugat

O altă opțiune pe care ați putea să o executați este să aveți o variabilă globală care are nodul selectat. Ar trebui să folosiți TreeNodeMouseClickEventArgs .

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

Acum aveți acces la acel nod și proprietățile sale.

0
adăugat