2009-12-28 13 views
13

मैं इसे फॉर्म के अंदर बंद करें। क्लोज़() को फॉर्म के अंदर बंद करना चाहता हूं।प्रोग्रामेटिक क्लोजरसन सेट करना

आमतौर पर, यह फॉर्म स्वयं इसे कॉल करके बंद कर दिया जाता है। बंद करें(), लेकिन मैं उपयोगकर्ता से पूछना चाहता हूं कि क्या वे वास्तव में फॉर्म को बंद करना चाहते हैं, और कुछ जानकारी के साथ एक मेलबॉक्स भेजना चाहते हैं। लेकिन मेरे पास यह है:

protected override void OnFormClosing(FormClosingEventArgs e) 
    { 
     if (e.CloseReason == CloseReason.UserClosing) 
     { 
      if (MessageBox.Show("¿Desea Salir realmente?\nLa factura aun no ha sido pagada por lo que volverá a la pantalla anterior y podrá seguir agregando productos") == DialogResult.No) 
      { 
       e.Cancel = true; 
      } 
     } 
     base.OnFormClosing(e); 
    } 

लेकिन हर बार जब मैं इसे कॉल करता हूं। बंद करें(); CloseReason हमेशा UserClosing है।

क्या मैं इसे कॉल के बाद सेट कर सकता हूं या मुझे ऑनफॉर्म क्लोजिंग को अलग करना होगा?

protected override void OnFormClosing(FormClosingEventArgs e) 
    { 
     if (e.CloseReason == CloseReason.UserClosing && !appClosing) 
     { 
      if (MessageBox.Show("¿Desea Salir realmente?\nLa factura aun no ha sido pagada por lo que volverá a la pantalla anterior y podrá seguir agregando productos") == DialogResult.No) 
      { 
       e.Cancel = true; 
      } 
     } 
     base.OnFormClosing(e); 
    } 
+0

बीटीडब्लू: संदेशबॉक्स.शो() अधूरा है क्योंकि मैंने इसे यहां लिखा है, वीएस – josecortesp

+1

में नहीं, मैंने यह भी पाया है कि फॉर्म.क्लोस() को कॉल करने के लिए बंदरगाह हमेशा उपयोगकर्ता क्लोजिंग होना प्रतीत होता है। यह थोड़ा मूर्खतापूर्ण है क्योंकि उपयोगकर्ता क्लोजिंग वास्तव में तब उत्पन्न होनी चाहिए जब उपयोगकर्ता बंद बटन दबाए, सिस्टम मेनू से बंद हो या Alt + F4 का फॉर्म चुनें। –

उत्तर

10

मुझे नहीं लगता कि आप ऐसा कर सकते हैं, एक झंडा

appClosing = true; 
this.Close(); 

का उपयोग और फिर उस के लिए जाँच करने के लिए क्या मैं हमेशा करना है सदस्य:

None 
WindowsShutDown 
MdiFormClosing 
UserClosing 
TaskManagerClosing 
FormOwnerClosing 
ApplicationExitCall 

जो मुझे विश्वास दिलाता है कि यह सामान्य रूप से रूपों के व्यवहार से संबंधित स्थितियों पर निर्भर है (उदा। एक पैरेंट फॉर्म बंद करना इसके बच्चों को बंद कर देता है)। तो तर्क के लिए कहने के लिए, CloseReason.AplicationExitCall, ईवेंट को एप्लिकेशन से ट्रिगर किया जाना चाहिए। कॉल करें।

के साथ भी यही कहते हैं कि एक CloseReason.FormOwnerClosing, अपने बच्चे रूपों form.Show (पैरेंट)

अपने लक्ष्य को बस क्यों प्रपत्र बंद हो रहा है की अतिरिक्त जानकारी के लिए है का उपयोग कर कहा जाता है यह मानते हुए कि, आप बस इसे स्टोर कर सकते हैं फॉर्म ऑब्जेक्ट के अंदर सार्वजनिक विशेषता या संपत्ति के रूप में इसे बाद में एक्सेस करने के लिए, माना जाता है कि फॉर्म का निपटारा नहीं किया गया था।

बंदरगाह को बदलने में आपकी प्रेरणा क्या थी, यह भी संभवतः मदद करेगा। संदर्भ http://msdn.microsoft.com/en-us/library/system.windows.forms.closereason.aspx

+0

ऐसा लगता है कि एकमात्र विकल्प है ... यह अब काम कर रहा है कि मैं कैसे चाहता था इसलिए मैं इसे इस तरह रखूंगा ... धन्यवाद! – josecortesp

5

CloseReason निम्नलिखित के साथ एक enum है:

11

के बजाय अतिरिक्त चर बनाने के लिए

CloseReason MSDN पेज:

appClosing = true; 
this.Close(); 

आप कॉल कर सकते हैं:

Application.Exit(); 

और फिर e.CloseReason बराबर होगा

CloseReason.ApplicationExitCall 

जो हो सकता है उसके बाद हो सकता है।

+0

अच्छा, धन्यवाद! बहुत बुरा है कि यह परियोजना पहले से ही समाप्त हो चुकी है (यह विश्वविद्यालय के काम के लिए थी)। लेकिन – josecortesp

6

जिस तरह से मैंने यह करना शुरू कर दिया है, इस फ़ॉर्म पर डायलॉग रेसल्ट प्रॉपर्टी को फॉर्म पर क्लिक करने के आधार पर अलग-अलग चीजों को सेट करना है।

अपने बटन क्लिक विधि में:

private void FillOrder_Click(object sender, EventArgs e) 
{ 
    this.DialogResult = DialogResult.OK; 
    // this.Close() is called automatically when you set DialogResult 
    // so the above line will close the form as well. 
} 

इस तरह आप FormClosing तरीकों में निम्न कर सकते हैं: जहाँ तक

private void Form_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    switch (e.CloseReason) 
    { 
     case CloseReason.UserClosing: 
      switch (this.DialogResult) 
      { 
       case DialogResult.OK: 
        // User has clicked button. 
        break; 
       case DialogResult.Cancel: 
        // User has clicked X on form, show your yes/no/cancel box here. 

        // Set cancel here to prevent the closing. 
        //e.Cancel = true; 
        break; 
      } 
      break; 
    } 
} 

रूप CloseReason हमेशा UserClosing को स्थापित किया जा रहा है, यह सेट किया गया है किसी भी क्रिया द्वारा उपयोगकर्ता द्वारा शुरू की जा सकने वाली किसी भी कार्रवाई के द्वारा, इस बात को बिल्कुल याद नहीं किया जा सकता है, लेकिन मुझे पूरा यकीन है कि एक टास्क मैनेजर फोर्स मार भी उपयोगकर्ता बंद हो रहा है। हालांकि मैं पुष्टि कर सकता हूं कि ऐप अभी भी चल रहा है, जबकि अन्य enum मानों को शटडाउन/रीबूट जैसे विभिन्न मामलों में सेट किया गया है। आप स्विच में सभी करीबी कारणों को पकड़कर और बंद करने को रद्द करके विंडोज़ को बंद कर सकते हैं।

+0

शायद सबसे अच्छा जवाब जानना वाकई अच्छा है। रद्दीकरण या मजबूर निकास से निपटने पर समापन कोड कुछ ऐसा उपयोग करेगा: e.Cancel = this.DialogResult! = DialogResult.Cancel && 'अन्य डोमेन स्थितियां'; – dmihailescu

+0

शानदार। धन्यवाद! –

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