c# - संदर्भ मेनू के तहत क्लिक किया गया नोड खोजें




winforms treeview (6)

मैं यह कैसे पता लगा सकता हूं कि ट्री में कौन सा नोड लिस्ट मेन्यू सक्रिय हो गया है? उदाहरण के लिए, नोड पर राइट-क्लिक करना और मेनू से एक विकल्प चुनना।

मैं ट्री-व्यूज़ की SelectedNode संपत्ति का उपयोग नहीं कर सकता क्योंकि नोड केवल राइट-क्लिक किया गया है और चयनित नहीं है।


आप TreeView में एक माउस क्लिक ईवेंट जोड़ सकते हैं, फिर माउस नोड द्वारा दिए गए GetNodeAt का उपयोग करके सही नोड का चयन करें जो 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);
        }
    }
}

इस प्रश्न को पुनर्जीवित करना क्योंकि मुझे यह एक बेहतर समाधान लगता है। मैं इसके बजाय NodeMouseClick इवेंट का उपयोग करता NodeMouseClick

void treeview_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if( e.Button == MouseButtons.Right )
    {
        tree.SelectedNode = e.Node;
    }
}

माक्र्स के जवाब के समान, यह मेरे द्वारा काम किया गया समाधान था:

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

यदि आप इसे प्रत्येक व्यक्ति के नोड पर सेट करते हैं, तो आपको संदर्भ मेनू स्वयं दिखाने की आवश्यकता नहीं है:

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

फिर ContextMenu की ओपनिंग इवेंट के अंदर, TreeView.SelectedNode प्रॉपर्टी सही नोड को दर्शाएगी।


मुझे मानक विंडो ट्रीव्यू व्यवहार चयन व्यवहार काफी कष्टप्रद लगता है। उदाहरण के लिए, यदि आप एक्सप्लोरर का उपयोग कर रहे हैं और एक नोड पर क्लिक करें और प्रॉपर्टीज पर राइट क्लिक करें, तो यह नोड को हाइलाइट करता है और आपके द्वारा क्लिक किए गए नोड के लिए गुण डायलॉग दिखाता है। लेकिन जब आप संवाद से लौटते हैं, तो हाइलाइट किया गया नोड पहले चयनित नोड था जिसे आपने राइट-क्लिक करने से पहले चुना था। मुझे लगता है कि यह प्रयोज्य समस्याओं का कारण बनता है क्योंकि मैं हमेशा इस बात पर भ्रमित हो रहा हूं कि क्या मैंने सही नोड पर काम किया है।

इसलिए हमारे कई GUI में, हम चयनित ट्री नोड को राइट क्लिक पर बदलते हैं ताकि कोई भ्रम न हो। यह एक्सप्लोरर की तरह एक मानक iwndos ऐप के समान नहीं हो सकता है (और हम प्रयोज्य कारणों के लिए मानक विंडो ऐप्स के बाद हमारे GUI व्यवहार का दृढ़ता से मॉडल करते हैं), मेरा मानना ​​है कि इस एक अपवाद के मामले में कहीं अधिक प्रयोग करने योग्य पेड़ हैं।

यहाँ कुछ कोड है जो राइट क्लिक के दौरान चयन को बदलता है:

  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 );
           }
        }
     }
  }

यह एक बहुत पुराना सवाल है, लेकिन मुझे अभी भी यह उपयोगी लगा। मैं ऊपर दिए गए कुछ उत्तरों के संयोजन का उपयोग कर रहा हूं, क्योंकि मैं नहीं चाहता कि दायाँ क्लिक नोड नोड चयनित हो जाए। अगर मुझे रूट नोड चुना गया है और इसके बच्चों में से एक को हटाना चाहते हैं, तो मैं नहीं चाहता कि जब मैं इसे हटाऊं तो मैं बच्चे का चयन करूं (मैं चयनित नोड पर कुछ काम भी कर रहा हूं जो मैं सही पर नहीं करना चाहता हूं- क्लिक करें)। यहाँ मेरा योगदान है:

// 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);
}

यहाँ मेरा समाधान है। इस लाइन को ट्री व्यू के NodeMouse क्लिक इवेंट में डालें:

 ((TreeView)sender).SelectedNode = e.Node;




contextmenu