2015-06-08 7 views
5

काम नहीं करता मैं एक फार्म (MainPage) है और मैं इसमें कुछ बार एक UserControl निर्धारित करते हैं, तो मैं आह्वान करने के लिए इस तरह उस रूप में एक विधि लिखें:एक UserControl की आह्वान

delegate void containerPanelCallback(UIPart uiPart); 
public void IncludeUIPart(UIPart uiPart) 
{ 
    if (this.containerPanel.InvokeRequired) 
    { 
     containerPanelCallback d = new containerPanelCallback(IncludeUIPart); 
     containerPanel.Invoke(d, new object[] { uiPart }); 
    } 
    else 
    { 
     containerPanel.Controls.Clear(); 
     containerPanel.Controls.Add(uiPart); 
    } 
    uiPart.Size = this.containerPanel.Size; 
    uiPart.Dock = DockStyle.Fill; 
} 

UIPart वर्ग UserControl से उत्तराधिकारी है कि मेरे UserControls UIPart से प्राप्त होते हैं।

इस विधि और इस तरह का शुभारंभ किया आह्वान: वैध

पार धागा आपरेशन नहीं:

public class myClass 
{ 
... 
private static MainPage _frmMain; 
private static myUIPart6 UIP6; 
... 
public static void aMethod(/* Some arguments */) 
{ 
    UIP6 = new myUIPart6 { /* Some settings of properties */ }; 
    _frmMain.IncludeUIPart(UIP6); 
    _frmMain.Show(); /*Throws an error*/ 
} 
... 
} 

त्रुटि है नियंत्रण 'mainpage' धागा यह जताने के अलावा और एक धागा तक पहुँच को निर्मित।

मैं कई सवाल और यहां इस त्रुटि के बारे में कई सवालों के जवाब मिल गया है, लेकिन मैं इसे समझ नहीं क्यों यह फेंकने है _frmMain.Show();? पर, मैं कुछ और आह्वान करना चाहिए? या मैं गलत तरीके से हूँ? क्या यह मेरे UserControl के हैंडल के निर्माण से संबंधित है?

+0

कैसे कर आप 'एमेशन' कहते हैं? –

+0

आमंत्रित() को गैर-मुख्य धागे से किए गए यूआई के साथ किसी भी/सभी संचालन के लिए बुलाया जाना चाहिए। आपके उदाहरण में, आप IncludeUIPart() को कॉल करते समय Invoke का उपयोग करते हैं, लेकिन _frmMain को कॉल करते समय कोई Invoke() नहीं दिखाएं। दिखाएं। आह्वान (में पूरे aMethod लपेटकर प्रयास करें) और IncludeUIPart() –

+0

से आह्वान कॉल को दूर मुझे लगता है कि आप जल्दी डेवलपर के रूप में रूप में अच्छी तरह 2000-वें अपने जोक के रूप में में हैं, कि जिस तरह से आप गंभीर बातों पर मजाक नहीं करना चाहिए पर तो) –

उत्तर

2

कोशिश निम्नलिखित कोड जोड़ने:

public static void aMethodCaller(){ 
if (_frmMain.InvokeRequired) 
    _frmMain.Invoke(new Action(aMethod)); 
else 
    aMethod(); 
} 

और aMethodCaller()

नीचे नमूना कोड है करने के लिए अपने कोड में aMethod() के सभी संदर्भ बदल देते हैं:

class Foo 
{ 
    static Form _frmMain; 
    public static void aMethod() 
    { 
     _frmMain.Show(); 
    }   
    public static void aMethodCaller() 
    { 
     if (_frmMain.InvokeRequired) 
      _frmMain.Invoke(new Action(aMethod)); 
     else 
      aMethod(); 
    } 
} 
+0

aMethod अपने प्रश्न में कोड के अनुसार स्थिर है, तो आप _frmMain.aMethod (के रूप में यह फोन नहीं कर सकते हैं), आप कर सकते हैं? - हम्म, यह पहले से ही हटाए गए ओप की टिप्पणी का उत्तर प्रतीत होता है –

+1

लोग इस समस्या का गलत समाधान कभी और कभी क्यों पोस्ट करते हैं। यह हाँ काम कर रहा है, लेकिन यह एक डिजाइन गलती है आप Inovke उपयोग करने के लिए एक और धागा से अपने यूआई बदलना होगा जब। – user743414

+0

@ user743414, आप सही हैं। लेकिन दुनिया अपूर्ण है।प्रत्येक डिज़ाइन दोषपूर्ण है, क्योंकि पूर्णता के लिए हमेशा जगह होती है ;-) गंभीरता से, लोग समाधान चाहते हैं जो "सही" समाधानों से कहीं अधिक काम करते हैं। फिर उन्हें दोषपूर्ण लेकिन कामकाजी समाधानों में समस्याएं मिलती हैं, इस तरह वे –

1

_frmMain.Show() किसी भी आमंत्रण आवश्यकता जांच द्वारा संरक्षित नहीं है। तो आप शायद इसे पृष्ठभूमि धागे में बुला रहे हैं।

+0

यदि आपके 'एमेथ' को गैर-यूआई थ्रेड से बुलाया जाता है तो आपको 'एमेक्यू 'में' InvokeRequired' की जांच करनी होगी और उचित थ्रेड में' _frmMain.Show() 'निष्पादित करना होगा जैसा कि आप इसे 'IncludeUIPart' में करते हैं । – Yegor

+0

इससे कोई फर्क नहीं पड़ता _where_ आप इसे कॉल करते हैं, महत्वपूर्ण बात यह है कि _how_ आप इसे कॉल करते हैं, यानी थ्रेड से। – Yegor

+0

मेरे पास एक थ्रेड 'सेंड' है जो 'MyUIPart5' के अंदर कॉल करता है जो 'एमेथ' कहता है। –

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