2008-10-29 5 views
9

पर सभी नियंत्रणों के लिए एक क्लिक को संभालना मेरे पास .NET UserControl (FFX 3.5) है। इस नियंत्रण में कई बाल नियंत्रण होते हैं - एक पैनल, एक जोड़े, लेबल, कुछ टेक्स्टबॉक्स, और फिर भी एक और कस्टम नियंत्रण। मैं आधार नियंत्रण पर कहीं भी दायाँ क्लिक को संभालना चाहता हूं - इसलिए किसी भी बच्चे के नियंत्रण (या पैनल के मामले में बच्चे के बच्चे) पर राइट क्लिक करें। मैं ऐसा करना चाहता हूं ताकि उदाहरण के लिए नए नियंत्रणों के लिए हैंडलरों में तार न किए बिना नियंत्रण में बदलाव हो।प्रपत्र

सबसे पहले मैंने WndProc को ओवरराइड करने का प्रयास किया, लेकिन जैसा कि मुझे संदेह था, मुझे केवल फॉर्म पर क्लिक के लिए संदेश मिलते हैं, न कि उसके किसी भी बच्चे।

foreach (Control c in this.Controls) 
    { 
    c.MouseClick += new MouseEventHandler(
     delegate(object sender, MouseEventArgs e) 
     { 
     // handle the click here 
     }); 
    } 

यह अब नियंत्रण है कि घटना का समर्थन है, लेकिन लेबल के लिए क्लिक मिलते हैं, उदाहरण के लिए, अभी भी कुछ नहीं मिलता है: एक अर्द्ध हैक रूप में, मैं InitializeComponent के बाद निम्नलिखित गयी। क्या ऐसा करने का कोई आसान तरीका है जिसे मैं देख रहा हूं?

void initControlsRecursive(ControlCollection coll) 
{ 
    foreach (Control c in coll) 
    { 
     c.MouseClick += (sender, e) => {/* handle the click here */}); 
     initControlsRecursive(c.Controls); 
    } 
} 

/* ... */ 
initControlsRecursive(Form.Controls); 

उत्तर

15

लेबल एक subcontrol में कर रहे हैं तो आप इस रिकर्सिवली कर दिया था

public class MyClass : UserControl 
{ 
    public MyClass() 
    { 
     InitializeComponent(); 

     MouseClick += ControlOnMouseClick; 
     if (HasChildren) 
      AddOnMouseClickHandlerRecursive(Controls); 
    } 

    private void AddOnMouseClickHandlerRecursive(IEnumerable controls) 
    { 
     foreach (Control control in controls) 
     { 
      control.MouseClick += ControlOnMouseClick; 

      if (control.HasChildren) 
       AddOnMouseClickHandlerRecursive(control.Controls); 
     } 
    } 

    private void ControlOnMouseClick(object sender, MouseEventArgs args) 
    { 
     if (args.Button != MouseButtons.Right) 
      return; 

     var contextMenu = new ContextMenu(new[] { new MenuItem("Copy", OnCopyClick) }); 
     contextMenu.Show((Control)sender, new Point(args.X, args.Y)); 
    } 

    private void OnCopyClick(object sender, EventArgs eventArgs) 
    { 
     MessageBox.Show("Copy menu item was clicked."); 
    } 
} 
+0

तो इतना स्पष्ट है कि मैं पेड़ों के लिए जंगल नहीं देख पा रहा था। धन्यवाद। – ctacke

0

एक कस्टम UserControl पर सभी नियंत्रण पर राइट क्लिक के लिए एक माउस क्लिक घटना को संभालने के लिए:

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

  • कोई संबंधित समस्या नहीं^_^