Najít uzlu klepnutí v kontextovém menu

hlasů
61

Jak mohu zjistit, který uzel v seznamu stromu byl aktivován kontextové menu? Například pravým tlačítkem myši na uzel a výběrem z menu.

Nemohu použít treeviews' SelectedNodevlastnost, protože uzel je teprve klepli pravým tlačítkem myši a není vybrána.

Položena 05/08/2008 v 17:21
zdroj uživatelem
V jiných jazycích...                            


9 odpovědí

hlasů
83

Můžete přidat událost myši TreeView, pak zvolte správné uzel pomocí GetNodeAt vzhledem myši souřadnic z vynaložených 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);
        }
    }
}
Odpovězeno 05/08/2008 v 17:36
zdroj uživatelem

hlasů
19

Tady je moje řešení. Dát tento řádek do NodeMouseClick případě TreeView:

 ((TreeView)sender).SelectedNode = e.Node;
Odpovězeno 09/12/2010 v 00:05
zdroj uživatelem

hlasů
11

Zjistil jsem, standardní chování výběr chování okna stromové být docela nepříjemné. Například, pokud používáte Explorer a pravým tlačítkem myši na uzel a hit vlastnosti podtrhuje, že je uzel a zobrazí dialogové okno vlastností pro uzel jste klikli. Ale když se vrátíte z dialogového okna je zvýrazněn uzel byl uzlem dříve vybrané / zvýrazněné, než jste na pravé tlačítko myši. Připadá mi to způsobuje problémy s použitelností, protože jsem navždy byla zmatená o tom, zda jsem hrál na pravém uzlu.

Tak v mnoha našich GUI, změníme vybraný uzel stromu na pravým tlačítkem myši tak, aby nedošlo k záměně. To nemusí být stejná jako standardní iwndos aplikace podobné Explorer (a mám tendenci silně modelovat naši GUI chování po standardních okenních aplikací pro usabiltiy důvodů), domnívám se, že tato jediná výjimka případ má za následek mnohem využitelných stromů.

Tady je nějaký kód, který změní výběr během pravým tlačítkem myši:

  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 );
           }
        }
     }
  }
Odpovězeno 11/12/2008 v 22:10
zdroj uživatelem

hlasů
6

Oživení na tuto otázku, protože jsem si to být mnohem lepší řešení. Používám NodeMouseClickmísto události.

void treeview_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if( e.Button == MouseButtons.Right )
    {
        tree.SelectedNode = e.Node;
    }
}
Odpovězeno 02/01/2013 v 20:41
zdroj uživatelem

hlasů
2

To je velmi stará otázka, ale já stále zjistil, že je užitečné. Jsem pomocí kombinace některých z výše uvedených odpovědí, protože nechci uzel klepli pravým tlačítkem myši, aby se stal selectedNode. Mám-li kořenový uzel vybrán a chcete odstranit jeden z jeho děti, nechci dítě zvolen, když jsem ji smazat (Jsem také dělá nějakou práci na selectedNode, že nechci, aby se stalo na pravicového click). Tady je můj příspěvek:

// 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);
}
Odpovězeno 06/12/2016 v 19:42
zdroj uživatelem

hlasů
2

Podobně jako Marcus' odpověď, to bylo nalezeno řešení jsem pracoval pro mě:

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

Nemusíte ukázat kontextového menu sami, pokud jej nastavit na každý jednotlivý uzel jako tak:

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

Pak dovnitř Zahájení akce v contextMenu je vlastnost TreeView.SelectedNode bude odrážet správné uzel.

Odpovězeno 21/11/2012 v 23:10
zdroj uživatelem

hlasů
0

Další možností by mohlo běžet je mít globální proměnnou, která má z vybraného uzlu. Byste stačí použít TreeNodeMouseClickEventArgs.

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

Nyní máte přístup k tomuto uzlu, a je to vlastností.

Odpovězeno 12/12/2016 v 20:30
zdroj uživatelem

hlasů
0

Zde je, jak to dělám.

private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Right)
        e.Node.TreeView.SelectedNode = e.Node;
}
Odpovězeno 29/05/2014 v 23:11
zdroj uživatelem

hlasů
0

Chcete-li, kontextové menu bude záviset na zvolené položce jste nejlepší tah Myslím, že je použít Jonesinator je kód pro výběr clicked položky. Svůj obsah kontextového menu pak může záviset na vybrané položky.

Výběrem položky jako první na rozdíl od prostě použitím kontextového menu poskytuje několik výhod. Prvním z nich je, že uživatel má vizuální indikaci o tom, které mu někdo klikne a tím která položka menu je spojena s. Druhým důvodem je, že tímto způsobem je to sakra hodně snazší udržet kompatibilní s jinými metodami vyvolání kontextového menu (např klávesové zkratky).

Odpovězeno 08/08/2008 v 15:04
zdroj uživatelem

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