Găsiți nod dat click în meniul contextual

voturi
61

Cum pot afla care nod într-o listă copac meniul contextual a fost activat? De exemplu, clic dreapta pe un nod și selectând o opțiune din meniu.

Nu pot utiliza treeviews' SelectedNodeproprietate , deoarece nodul este fost doar făcut clic dreapta și nu ați selectat.

Întrebat 05/08/2008 la 17:21
sursa de către utilizator
În alte limbi...                            


9 răspunsuri

voturi
83

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);
        }
    }
}
Publicat 05/08/2008 la 17:36
sursa de către utilizator

voturi
19

Aici este soluția mea. Pune această linie în eveniment NodeMouseClick a TreeView:

 ((TreeView)sender).SelectedNode = e.Node;
Publicat 09/12/2010 la 00:05
sursa de către utilizator

voturi
11

Am găsi ferestrele TreeView comportamentului standard de selecție comportament pentru a fi destul de enervant. De exemplu, dacă utilizați Explorer și faceți clic dreapta pe un nod și a lovit Properties, se evidențiază nodul și prezintă proprietățile de dialog pentru nodul pe care ați făcut clic. Dar atunci când reveniți din dialogul, nodul evidențiat a fost nodul selectat / evidențiat înainte de a făcut clic dreapta anterior. Am găsit acest lucru cauzează probleme de utilizabilitate pentru că eu sunt pentru totdeauna confuzie dacă am acționat pe nodul din dreapta.

Deci, în multe dintre noastre GUIs, vom schimba nodul arborelui selectat pe un clic dreapta, astfel încât nu există nici o confuzie. Acest lucru nu poate fi la fel ca o aplicatie iwndos standard, cum ar fi Explorer (și am tendința de a modela comportamentul nostru puternic GUI după fereastra de aplicații standard pentru motive usabiltiy), cred că acest caz, o singură excepție rezultă copaci cu mult mai ușor de utilizat.

Aici este un cod care se schimbă selecția în timpul click dreapta:

  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 );
           }
        }
     }
  }
Publicat 11/12/2008 la 22:10
sursa de către utilizator

voturi
6

Revitalizarea această întrebare pentru că mi se pare a fi o soluție mult mai bună. Eu folosesc NodeMouseClickevenimentul în loc.

void treeview_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if( e.Button == MouseButtons.Right )
    {
        tree.SelectedNode = e.Node;
    }
}
Publicat 02/01/2013 la 20:41
sursa de către utilizator

voturi
2

Aceasta este o întrebare foarte veche, dar am găsit încă util. Sunt folosind o combinație a unora dintre răspunsurile de mai sus, pentru că nu vreau nodul clic dreapta pentru a deveni selectedNode. Dacă am nodul rădăcină selectat și doriți să ștergeți unul dintre copii este, eu nu vreau copilul selectat când îl șterg (eu fac, de asemenea, unele de lucru pe selectedNode pe care nu vreau să se întâmple pe un right- clic). Aici este 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);
}
Publicat 06/12/2016 la 19:42
sursa de către utilizator

voturi
2

Similar cu răspunsul lui Marcus, aceasta a fost soluția am găsit lucrat pentru mine:

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

Nu este nevoie să arate meniul contextual vă dacă ați setat la fiecare nod individual, astfel cum ar fi:

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

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

Publicat 21/11/2012 la 23:10
sursa de către utilizator

voturi
0

O altă opțiune ar putea rula cu este de a avea o variabilă globală care are nodul selectat. Ai avea nevoie doar să folosească TreeNodeMouseClickEventArgs.

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

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

Publicat 12/12/2016 la 20:30
sursa de către utilizator

voturi
0

Iată cum o fac.

private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Right)
        e.Node.TreeView.SelectedNode = e.Node;
}
Publicat 29/05/2014 la 23:11
sursa de către utilizator

voturi
0

Dacă doriți meniul contextual să fie dependentă de elementul selectat tu ești cea mai bună mișcare cred că este de a folosi codul Jonesinator pentru a selecta elementul dat clic. Conținutul dvs. meniul contextual poate fi dependentă de elementul selectat.

Selectarea elementului întâi, spre deosebire de doar folosind pentru meniul contextual oferă câteva avantaje. Primul este acela că utilizatorul are o indicație vizuală cu privire la care el a făcut clic și, astfel, elementul care meniul este asociat. Al doilea este că în acest fel este o dracu 'de mult mai ușor să păstrați compatibile cu alte metode de a invoca meniul contextual (de exemplu, comenzile rapide de la tastatură).

Publicat 08/08/2008 la 15:04
sursa de către utilizator

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