2010-07-02 35 views
7

मैं एक कोड है परिभाषित करता है:विधि 'XXX' एक घटना के लिए विधि नहीं हो सकता है क्योंकि एक वर्ग इस वर्ग के पहले ही से निकला विधि

public class Layout : UserControl 
{  
    protected void DisplayX_DisplayClicked(object sender, DisplayEventArgs e) 
    { 
     CurrentDisplay = (CameraPanel)sender; 
    } 
} 

'लेआउट' मेरे अन्य लेआउट के लिए एक आधार वर्ग है। उदाहरण के लिए, मेरे पास बेस क्लास 'लेआउट' से व्युत्पन्न 'लेआउट 1' है। लेआउट 1 में एक तत्व Display01 है। Display01 में एक DisplayClicked घटना है। मैं DisplayX_Display को प्रदर्शित करने की कोशिश कर रहा हूं Visual Studio Designer के माध्यम से Display01 के प्रदर्शन क्लिक किए गए ईवेंट पर क्लिक किया गया।

public partial class Layout1 : Layout 
{ 
    private CameraPanel Display01; 
} 

यह मुझे एक त्रुटि देता है:

विधि 'XXX' एक घटना के लिए विधि क्योंकि एक वर्ग इस वर्ग के पहले ही से निकला पद्धति निर्धारित करता है नहीं हो सकता।

बेस क्लास से व्युत्पन्न कक्षा के ईवेंट के रूप में विधि का उपयोग कैसे करें? क्या यह संभव है ? यदि हां, तो कैसे। यदि नहीं, क्यों।

+0

मैं इसे बिल्कुल repro नहीं करता। क्या * बिल्कुल * आप टाइप करते हैं? –

+0

@ हंस, आप पुन: पेश नहीं कर सकते? ठीक है, चरण-दर-चरण। 1. नया बेस क्लास लेआउट जोड़ें: UserControl। 2. बेस क्लास में खाली निकाय के साथ विधि DisplayX_DisplayClicked (ऑब्जेक्ट प्रेषक, DisplayEventArgs ई) जोड़ें। 3. व्युत्पन्न कक्षा लेआउट 1 जोड़ें: लेआउट। 4. लेआउट 1 पर कुछ नियंत्रण जोड़ें, उदाहरण के लिए मैंने कैमरापैनल डिस्प्ले 01 जोड़ा। Display01 में एक ईवेंट DisplayClicked है। मैं Display01 में एक इवेंटहेडलर जोड़ना चाहता हूं। विजुअल स्टूडियो डिज़ाइनर के माध्यम से डिस्प्लेक्लेक्टेड। मैं उस लक्ष्य के लिए बेस क्लास से एक विधि का उपयोग करना चाहता हूं। लेकिन बनाम डिजाइनर इसे अस्वीकार कर दिया। ___ मैं दृश्य स्टूडियो डिज़ाइनर के माध्यम से मैन्युअल नहीं के माध्यम से एक ईवेंट हैंडलर जोड़ना चाहता हूं। – nik

+0

आपने जो कहा है वह आपने नहीं कहा था। –

उत्तर

9

डिजाइनर इसे संभाल नहीं सकता है, लेकिन आप इसे कोड में ठीक कर सकते हैं। Layout1 के लिए निर्माता में, बस लिखना:

public Layout1() 
{ 
    InitializeComponent(); 
    this.Display01.DisplayClicked += base.DisplayX_DisplayClicked; 
} 

वैकल्पिक रूप से, आप दे सकता है डिजाइनर एक विधि Display01_DisplayClicked नामित जेनरेट करना और फिर इसे लागू के रूप में:

private void Display01_DisplayClicked(object sender, DisplayEventArgs e) 
{ 
    base.DisplayX_DisplayClicked(sender, e); 
} 

एक बहुत अधिक वर्बोज़ है यही कारण है कि, तो मैं यह पहला तरीका होगा, लेकिन यह डिजाइनर को यह पता चलेगा कि उस घटना के लिए एक हैंडलर था।

+0

क्यों विजुअल स्टूडियो डिजाइनर बेस क्लास विधि का उपयोग करने की अनुमति नहीं देता है? – nik

+0

क्योंकि डिजाइनर केवल वर्तमान कक्षा में खोज करता है। – serhio

+0

मैं base.xxx के साथ आपके समाधान का उपयोग करूंगा ... हालांकि, यह बहुत अच्छा नहीं है, क्योंकि मैं इन स्टूडियो को विजुअल स्टूडियो डिजाइनर में नहीं देख सकता। यदि कोई अन्य प्रोग्रामर विजुअल स्टूडियो desinger => में उपयोगकर्ता नियंत्रण को देखेगा तो उसे कुछ भी नहीं दिखाई देगा (कुछ भी?)। @ सेरहियो, खराब स्टूडियो। लेकिन दूसरी ओर, बनाम डिजाइनर पूरे पदानुक्रम को देखना चाहिए? शायद चाहिए, और शायद नहीं होना चाहिए ... – nik

2

डिज़ाइनर केवल आपके द्वारा संपादित की जा रही कक्षा में विधियों के लिए दिखता है। इस समस्या को हल करने के लिए आप अपने उप-वर्ग में विधि को ओवरराइट कर सकते हैं और केवल बेस विधि को कॉल कर सकते हैं। यह डिजाइनर में बस ठीक काम करेगा।

protected override void DisplayX_DisplayClicked(object sender, DisplayEventArgs e) 
    { 
     base.DisplayX_DisplayClicked(sender, e); 
    } 
संबंधित मुद्दे