संदर्भ मेनू के तहत क्लिक नोड खोजें

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

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

0
जोड़ा संपादित
विचारों: 3

9 उत्तर

यदि आप चाहते हैं कि संदर्भ मेनू चयनित आइटम पर निर्भर हो, तो आप सबसे अच्छे कदम उठाएंगे, मुझे लगता है कि क्लिक किए गए आइटम का चयन करने के लिए जोन्सिनेटर कोड का उपयोग करना है। आपकी संदर्भ मेनू सामग्री तब चयनित आइटम पर निर्भर हो सकती है।

संदर्भ मेनू के लिए इसका उपयोग करने के विरोध में पहले आइटम का चयन कुछ फायदे देता है। पहला यह है कि उपयोगकर्ता के पास एक दृश्य संकेत है जिसके लिए उसने क्लिक किया और इस प्रकार मेनू किस आइटम से जुड़ा हुआ है। दूसरी बात यह है कि इस तरह संदर्भ मेनू (जैसे कीबोर्ड शॉर्टकट) का आविष्कार करने के अन्य तरीकों के साथ संगत रखना बहुत आसान है।

0
जोड़ा

आप TreeView पर एक माउस क्लिक इवेंट जोड़ सकते हैं, फिर MouseEventArgs द्वारा प्रदान किए गए माउस निर्देशांक दिए गए GetNodeAt का उपयोग करके सही नोड का चयन करें।

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
जोड़ा
मुझे माउसअप के बजाए माउसडाउन ईवेंट के साथ वांछित परिणाम मिला।
जोड़ा लेखक Javier, स्रोत
बहुत बहुत धन्यवाद, मेरे पास समाधान के लिए एक छोटा सा जोड़ा है: आप "_NodeMouseClick" ईवेंट का भी उपयोग कर सकते हैं जो आपको "TreeNodeMouseClickEventArgs e" देता है, इस स्थिति में आप केवल ई.ओडोड का उपयोग कर सकते हैं और जांच के साथ परेशान नहीं होना चाहिए गीला नोड शून्य है या नहीं।
जोड़ा लेखक SDM, स्रोत

मार्कस के जवाब के समान, यह वह समाधान था जो मैंने पाया मेरे लिए काम किया:

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 प्रॉपर्टी सही नोड को प्रतिबिंबित करेगी।

0
जोड़ा

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

void treeview_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if( e.Button == MouseButtons.Right )
    {
        tree.SelectedNode = e.Node;
    }
}
0
जोड़ा
मेरा = जैसा ही)
जोड़ा लेखक deej, स्रोत
मुझे यह भी बेहतर पसंद है।
जोड़ा लेखक Joey Novak, स्रोत

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

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

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

  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
जोड़ा
यह मेरे लिए सबसे अच्छा समाधान है क्योंकि यह वास्तव में उस नोड का चयन करता है जिस पर आपने क्लिक किया था।
जोड़ा लेखक CAD bloke, स्रोत

मेरा समाधान यहाँ है। इस लाइन को TreeView के नोडमैउसक्लिक ईवेंट में रखें:

 ((TreeView)sender).SelectedNode = e.Node;
0
जोड़ा
अच्छा और सरल
जोड़ा लेखक AndrewJE, स्रोत
माउस इवेंट तर्क में नोड नहीं है
जोड़ा लेखक CAD bloke, स्रोत
हाँ, लेकिन TreeNodeMouseClickEventArgs (जो नोडमाउसक्लिक ईवेंट में पास हो जाते हैं) करते हैं। तो मेरा समाधान काम कर रहा है और कुछ अन्य समाधानों की तरह अधिक जटिल नहीं है
जोड़ा लेखक deej, स्रोत
आपका नया नायक
जोड़ा लेखक garaber, स्रोत

यहां मैं यह कैसे करता हूं।

private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Right)
        e.Node.TreeView.SelectedNode = e.Node;
}
0
जोड़ा

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

// 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
जोड़ा

एक और विकल्प जिसे आप चला सकते हैं वह वैश्विक वैरिएबल है जिसमें चयनित नोड है। आपको बस TreeNodeMouseClickEventArgs का उपयोग करने की आवश्यकता होगी।

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

अब आपके पास उस नोड और इसकी संपत्तियों तक पहुंच है।

0
जोड़ा