2008-08-05 12 views
61

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

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

उत्तर

83

आप ट्री व्यू में माउस क्लिक इवेंट जोड़ सकते हैं, फिर 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); 
     } 
    } 
} 
+4

बहुत बहुत धन्यवाद, मेरे पास समाधान के लिए एक छोटा सा जोड़ा है: आप "_NodeMouseClick" ईवेंट का भी उपयोग कर सकते हैं जो आपको "TreeNodeMouseClickEventArgs e" देता है, इस मामले में आप केवल ई.ओडोड का उपयोग कर सकते हैं और नहीं गीले की जांच के साथ परेशान करने के लिए नोड शून्य है या नहीं। – SDM

+0

मुझे माउसअप के बजाए माउसडाउन ईवेंट के साथ वांछित परिणाम मिला। – Javier

0

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

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

11

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

तो हमारे कई जीयूआई में, हम चयनित पेड़ नोड को राइट-क्लिक पर बदलते हैं ताकि कोई भ्रम न हो। यह एक्सप्लोरर जैसे मानक 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

यह मेरे लिए सबसे अच्छा समाधान है क्योंकि यह वास्तव में उस नोड का चयन करता है जिस पर आपने क्लिक किया था। –

18

यहाँ मेरी समाधान है:

यहाँ कुछ कोड है कि राइट क्लिक दौरान चयन बदल जाता है। TreeView का NodeMouseClick घटना में इस लाइन रखो:

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

माउस इवेंट तर्क में नोड –

+2

हाँ है लेकिन TreeNodeMouseClickEventArgs (जो ** NodeMouseClick ** ईवेंट में पास हो जाते हैं) करते हैं। तो मेरा समाधान काम कर रहा है और कुछ अन्य समाधानों की तरह अधिक जटिल नहीं है – deej

+1

अच्छा और सरल – AndrewJE

2

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

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

6

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

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

मेरा जैसा ही =) – deej

+0

मुझे यह भी बेहतर पसंद है। –

0

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

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

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

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

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

संबंधित मुद्दे