2010-05-10 11 views
7

को अवरुद्ध करना यह एक बेवकूफ सवाल होना चाहिए, लेकिन मैं इसे समझ नहीं सकता। मैं डिजाइनर का भी उपयोग नहीं कर सकता क्योंकि मेरे सामने कोडर जीयूआई फेंकने में कामयाब रहे और सभी को तर्क दिया, इसलिए अब यह उलझन में है। मुझे इसे पुराने स्कूल के तरीके से करना है।.NET विंडोज फॉर्म - बंद एक्स ईवेंट

मेरे पास एक ऐसा फॉर्म है जिसे 3 तरीकों से बंद किया जा सकता है: बंद करें बटन, फ़ाइल/बंद मेनू, और एक्स आइकन। मैं चाहता हूं कि वे सभी एक ही काम करें। बटन को अवरुद्ध करना और मेनू ईवेंट आसान है। वास्तव में, दोनों को onCloseConfig विधि से जोड़ दिया जाता है। बीटीडब्ल्यू, क्या इस विधि के लिए एक बेहतर नाम है?

private void onCloseConfig(object sender, System.EventArgs e) 
{ 
    if (! m_configControl.Modified) 
    { 
     Application.Exit(); // Or should it be this.Close(); 
    } 
    .... 
    // Else present a dialog, ask if they want to save. 
} 

तो, X रोकना मैंने कोशिश की: this.FormClosing +=new FormClosingEventHandler(this.onCloseConfig); मेरा मानना ​​है कि यह है कि क्या एक अनंत लूप का कारण बनता है। मुझे यह नहीं चाहिए :) FormClosed एक और विकल्प है, लेकिन यह बहुत देर हो चुकी है। मैं सिर्फ इस तथ्य को रोकना चाहता हूं कि एक्स पर क्लिक किया गया था, न कि यह तथ्य कि यह बंद हो रहा है।

उत्तर

12

मुझे लगता है कि आप फॉर्म बंद करना चाहते हैं, जो चीज आपको याद आ रही है वह बंद करने के कारण की जांच करना है और अगर उपयोगकर्ता से है तो इसे रद्द कर दें

private void my_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (e.CloseReason == CloseReason.UserClosing) 
    { 
    e.Cancel = true; //I'm sorry Dave, I'm afraid I can't do that. 
    } 
} 

'एक्स' सेट Form.ControlBox = false को छिपाने के लिए है, लेकिन इस रूप में अच्छी तरह न्यूनतम/अधिकतम से छुटकारा मिल जाएगा।

+0

कूल के रूप में FormClosingEventArgs की आवश्यकता है! क्या एक्स को पूरी तरह छिपाने का कोई तरीका है? –

+0

अपनी खिड़की क्रोम रोलिंग के बिना नहीं। – Nate

+1

आप न्यूनतम अधिकतम और बंद हो सकते हैं हालांकि –

0

इस समापन से खिड़की बंद कर देना चाहिए: FormClosing (वस्तु प्रेषक, System.EventArts ई) { अगर (e.CloseReason == CloseReason.UserClosing) e.Cancel = true }

+1

System.EventArts [sic] या EventArgs के पास CloseReason सदस्य नहीं है, तो आपको मेरे उत्तर –

1

बीटीडब्ल्यू, विधि के लिए कोई बेहतर नाम है?

बंद करें [फॉर्मनाम] बेहतर विकल्प हो सकता है।

या यह होना चाहिए। बंद करें();

हां, यदि आप चाहते हैं कि फॉर्म को बंद करना है।

आपको फॉर्मक्लोसिंग ईवेंट के लिए एक नया ईवेंट हैंडलर बनाना चाहिए। यह FormClosingEventArgs में लेता है और पैरामीटर के रूप में EventArgs नहीं। बटन और मेनू आइटम के क्लिक हैंडलर में, बस यह करें। बंद करें()।

यह ईवेंट को कॉल करेगा और आप वहां अपने सभी चेक रख सकते हैं।

3

बंद करें बटन/मेनू के लिए एक अलग विधि बनाएं:

private void myButton_Click(object sender, EventArgs e) 
{ 
    this.Close(); 
} 

private void myMenuButton_Click(object sender, EventArgs e) 
{ 
    this.Close(); 
} 

private void myForm_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (m_configControl.Modified) 
    { 
     var result = MessageBox.Show("Name Of Application", "Would you like to save before closing?", MessageBoxButtons.YesNoCancel); 
     if(result == DialogResult.Yes) 
      //Save here 
     else if(result == DialogResult.Cancel) 
      e.Cancel = true; 
    } 
} 

या, आप बंद बटन ("X") कुल मिलाकर this.ControlBox = false

+0

+1 एक अलग विधि बनाने और उत्तर देने के लिए उत्तर दें। =) –

1

FormClosed event की स्थापना द्वारा निष्क्रिय कर सकते हैं फार्म एक बार होता है बंद हो गया है। यह निश्चित रूप से आप नहीं चाहते हैं।

FormClosing event आपको जो चाहिए वह अधिक संभावना है।

फॉर्मक्लोसिंग ईवेंट ट्रिगर किया गया है जो भी बटन या मेनू लिंक क्लिक किया गया है। जो कुछ भी फॉर्म को बंद करने का प्रयास करता है वह फॉर्मक्लोज़िंग ईवेंट को ट्रिगर करेगा।

if(m_configControl.Modified) 
    e.Cancel = true; 

इसलिए जब तक config नियंत्रण संशोधित किया गया है, प्रपत्र समापन रखेंगे:

अब, FormClosingEventArgs उपयोग करने के लिए अधिक उपयुक्त तरीका है अपने FormClosing ईवेंट हैंडलर विधि के भीतर निम्नलिखित होगा। आप इसे केवल बंद होने से रोकना चाहते हैं यदि परिवर्तन या सहेजे गए परिवर्तन हैं।

संपादित 2 अपने प्रश्न फिर से पढाना के बाद, ऊपरी कोड को अपने परिवर्तनों को नीचे देखें:

if(m_configControl.Modified) 
    if(DialogResult.OK == MessageBox.Show("Do you want to save changes?", "Changes detected") 
     SaveChanges(); 

यह तो बिना सहेजे गए परिवर्तन के लिए संकेत करें और बचाने के उपयोगकर्ता MessageBox में ठीक क्लिक किया केवल तभी होगा। ध्यान दें कि आपको MessageBox.Show() विधि के अतिरिक्त पैरामीटर के अनुसार बटन जोड़ना होगा।

आप एक हाँ पूरा करने के लिए चाहते हैं/नहीं/FormClosing पर रद्द, तो आप इस तरह से जाना होगा:

if(m_configControl.Modified) { 
    DialogResult dr = MessageBox.Show(...); 
    switch(dr) { 
     case DialogResult.OK: 
      SaveChanges(); 
      break; 
     case DialogResult.No: 
      // Do nothing... 
      break; 
     case DialogResult.Cancel: 
      e.Cancel = true; 
    } 
} 

तो, जब उपयोगकर्ता हाँ क्लिक करता है, आपके आवेदन परिवर्तन बचत होगी। जब वह नंबर पर क्लिक करता है, तो एप्लिकेशन इसके बारे में कुछ नहीं करेगा और इसके बंद होने पर जारी रहेगा। जब उपयोगकर्ता एप्लिकेशन पर वापस आना चाहता है, तो बंद हो जाएगा।

संपादित करेंThis Question पर मेरे उत्तर पर नजर डालें जो आपको लगता है कि आप क्या करना चाहते हैं।

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