2012-11-23 7 views
5

मुझे एक फॉर्म मिला है जहां मैं पर आधारित FormClosing ईवेंट को अलग-अलग संभालता हूं। उदाहरण के लिए, मैं CloseReason.UserClosing पर फॉर्म को कम कर रहा हूं, जब मैं डब्लूसीएफ सेवा कॉल से एक विशिष्ट मान वापस लौटाता हूं तो प्रोग्राम प्रोग्रामेटिक रूप से कॉल कर रहा हूं और मैं कुछ अन्य स्थितियों के बीच ऐप को बंद करने के लिए अधिसूचना आइकन contextmenu ItemClicked ईवेंट से Application.Exit() पर कॉल कर रहा हूं।क्या ऐसे कोई मामले हैं जहां Application.Exit() फॉर्मक्लोज़िंग ईवेंट नहीं बढ़ाता है?

जबकि मेरा ऐप अब तक अपेक्षित काम करता है, FormClosing ईवेंट को हमेशा Application.Exit() कहलाता था, यह मेरे द्वारा किए गए कुछ बदलावों के बाद ऐसा व्यवहार नहीं करता है। अधिकांश बार ऐप ईवेंट को उठाए बिना बंद हो रहा है, और कुछ बार जो इसे उठा रहा है, ईवेंट पर कोड निष्पादित किया गया है (डेटाबेस का काम, आइकन डिस्पोजेक्ट को सूचित करें) फॉर्म से बाहर निकले बिना।

यह कैसे हो सकता है?

+0

मुझे पता चला कि 'ShowInTaskbar = false;' 'application.Exit() '' फॉर्मक्लोसिंग 'ईवेंट को ट्रिगर नहीं करता था, जब आमतौर पर ऐसा होता था। –

उत्तर

11

हां, यह संभव है। Application.Exit() विधि अनुप्रयोग में प्रपत्रों को पुन: सक्रिय करती है। ओपनफॉर्म संग्रह को उनके ऑनफॉर्मक्लोसिंग() विधि को कॉल करने के लिए। Winforms में एक बग है जो उस संग्रह को खुले रूपों का ट्रैक खो देता है। यह कोड इसे प्रदर्शित करता है:

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
    } 
    protected override void OnHandleCreated(EventArgs e) { 
     // Set breakpoint here: 
     base.OnHandleCreated(e); 
    } 
    protected override void OnMouseDown(MouseEventArgs e) { 
     this.ShowInTaskbar = !this.ShowInTaskbar; 
     MessageBox.Show(string.Format("There are {0} open forms", Application.OpenForms.Count)); 
     Application.Exit(); 
    } 
    protected override void OnFormClosing(FormClosingEventArgs e) { 
     MessageBox.Show("you won't see this"); 
     base.OnFormClosing(e); 
    } 
} 

बग ट्रिगर करने के लिए फ़ॉर्म पर क्लिक करें। ध्यान दें कि यह 0 खुले रूपों की रिपोर्ट कैसे करता है और आपने कभी भी ऑनफॉर्म क्लोजिंग में प्रदर्शित संदेश बॉक्स को कैसे नहीं देखा।

यह ShowInTaskbar संपत्ति का असाइनमेंट है जो इसका कारण बनता है। ऐसी कई संपत्तियां हैं, मैंने ShowInTaskbar चुना क्योंकि यह एक ऐसा है जब आपके पास NotifyIcon है। राइट टॉफ्ट एक और है। ये गुण विशेष हैं क्योंकि उन्हें केवल तब निर्दिष्ट किया जा सकता है जब विंडो देशी CreateWindowEx() api फ़ंक्शन के साथ बनाई जाती है। उन्हें बदलने के लिए Winforms कुछ सुंदर वीर करने की आवश्यकता है, यह खिड़की को नष्ट कर देता है और इसे फिर से बनाता है। दुर्भाग्य से यह भी बग को ट्रिगर करता है, खिड़की को नष्ट करने से फॉर्म को ओपनफॉर्म संग्रह से हटा दिया जाता है और यह इसे वापस जोड़ना भूल जाता है।

इस स्निपेट से OnHandleCreated() विधि को अपने फॉर्म में कॉपी/पेस्ट करें और उस पर ब्रेकपॉइंट सेट करें। विंडो को पहली बार बनाया जाने पर इसे एक बार ट्रिगर करना होगा। जब यह फिर से ट्रिगर होता है और इस प्रकार बग परिदृश्य का आह्वान करता है तो आप यह देखने के लिए कॉल स्टैक को देख सकते हैं कि आपकी कक्षा में कौन सा कोड ट्रिगर हुआ है। आपको उस कोड को अक्षम करना होगा और इसे करने का दूसरा तरीका ढूंढना होगा। कन्स्ट्रक्टर में ShowInTaskbar प्रॉपर्टी सेट करना ठीक है, जब आप खिड़की के निर्माण के बाद इसे असाइन करते हैं तो यह केवल खराब हो जाता है, जैसे लोड इवेंट हैंडलर में।

+0

धन्यवाद, यह वास्तव में मैंने जो बदलाव किया है, वह है। 'ShowInTaskbar' प्रॉपर्टी जिसे मैं' फॉर्मलोड 'ईवेंट के अंत में सत्य पर सेट कर रहा हूं, उसके बाद आवेदन पूरा होने के दौरान किए जाने वाले सभी कार्यों के बाद। मैं इस पर गौर करूंगा। – Pantelis

+0

यह अन्य गुण होने के कारण क्या हो सकता है? मैंने फॉर्मलोड ईवेंट से संपत्ति को सेट करना हटा दिया है और यह अभी भी होता है। हालांकि कम बार-बार, दस बार में से एक की तरह, लेकिन यह अभी भी होता है। – Pantelis

+0

कई विषम-गेंद कोने के मामले हैं। यही कारण है कि मैंने आपको ऑनहैंडलक्रेटेड विधि पर ब्रेकपॉइंट के साथ डीबग करने की अनुशंसा की। –

1

खैर के रूप में stated here

Form.Closed और Form.Closing घटनाओं उठाया नहीं कर रहे हैं जब Application.Exit विधि अपने आवेदन बाहर निकलने के लिए कहा जाता है। यदि आप में इन घटनाओं में से किसी एक में सत्यापन कोड है, जिसे निष्पादित किया जाना चाहिए, तो आपको बाहर निकलने के तरीके को कॉल करने से पहले प्रत्येक खुले रूप में के लिए Form.Close विधि को कॉल करना चाहिए।

संपादित

जब से तुम, FormClosing उपयोग कर रहे हैं कि इस मामले में हो सकता है आप Exit का अधिभार जो और रूप है जो बाहर निकलें रद्द निर्धारित करने में मदद कर सकता है आप इस समस्या को आगे का निरीक्षण करने में मदद का उपयोग कर प्रयास करना चाहिए।

+0

परियोजना में कुछ माध्यमिक रूप हैं लेकिन उनमें से कोई भी खुला नहीं है। इसके अलावा मैं अप्रचलित समापन घटना को नहीं बुला रहा हूं। मैं फॉर्मक्लोज़िंग इवेंट बुला रहा हूं। – Pantelis

+0

बाहर निकलना रद्द हो रहा है बहुत बार। मुख्य रूप से मुख्य फॉर्म के 'फॉर्मक्लोसिंग' ईवेंट को उठाए बिना ऐप निकलता है। – Pantelis

+0

@ पैंटेलिस, फिर भी अप्रचलित WinForms का उपयोग कर। – Jodrell

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

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