2010-04-21 21 views
67

एमएसडीएन में मुझे CloseReason.UserClosing पता चला कि उपयोगकर्ता ने फॉर्म बंद करने का निर्णय लिया था, लेकिन मुझे लगता है कि यह एक्स बटन पर क्लिक करने या बंद बटन पर क्लिक करने के लिए समान है। तो मैं अपने कोड में इन दोनों के बीच अंतर कैसे कर सकता हूं?उपयोगकर्ता को कैसे पता चलेगा कि "एक्स" या "बंद करें" बटन क्लिक किया गया है?

धन्यवाद सब कुछ।

+1

आपका करीबी बटन क्या मतलब है? –

+0

क्या "बंद करें बटन"? – SLaks

+0

उदाहरण के लिए "ALT + F4" – Bohn

उत्तर

66

मान लीजिए कि आप WinForms के लिए पूछ रहे हैं, तो आप FormClosing() event का उपयोग कर सकते हैं। इवेंट फॉर्मक्लोसिंग() किसी भी फॉर्म को बंद होने के लिए ट्रिगर किया जाता है।

यह पता लगाने के लिए कि उपयोगकर्ता या तो एक्स या आपके क्लोजबटन पर क्लिक किया गया है, तो आप इसे प्रेषक ऑब्जेक्ट के माध्यम से प्राप्त कर सकते हैं। प्रेषक को बटन नियंत्रण के रूप में डालने का प्रयास करें, और उदाहरण के लिए, शायद इसके नाम "क्लोजबटन" के लिए सत्यापित करें।

private void Form1_FormClosing(object sender, FormClosingEventArgs e) { 
    if (string.Equals((sender as Button).Name, @"CloseButton")) 
     // Do something proper to CloseButton. 
    else 
     // Then assume that X has been clicked and act accordingly. 
} 

अन्यथा, मैंने कभी अंतर करने के लिए है कि क्या एक्स या CloseButton क्लिक किया गया था की जरूरत कभी नहीं किया है, जैसा कि मैंने MDIContainerForm बंद करने, या घटना बिना सहेजे गए परिवर्तन के लिए जाँच से पहले सभी MdiChildren बंद करने की तरह, कुछ FormClosing घटना पर विशेष प्रदर्शन करना चाहता था । इन परिस्थितियों में, हमें किसी भी बटन से अलग करने के लिए, मेरे अनुसार, आवश्यकता नहीं है।

एएलटी + F4 द्वारा बंद करने, FormClosing() घटना को ट्रिगर किया जाएगा यह फार्म है कि बंद करने के लिए कहते हैं एक संदेश भेजता है के रूप में। आप

FormClosingEventArgs.Cancel = true. 

की स्थापना हमारे उदाहरण में से घटना रद्द कर सकते हैं, इस होना करने के लिए

e.Cancel = true. 

सूचना FormClosing (के बीच अंतर) और FormClosed() घटनाओं अनुवाद होगा।

फॉर्मक्लोज़िंग तब होती है जब फॉर्म को बंद करने के लिए संदेश प्राप्त होता है, और सत्यापित करता है कि इसे बंद होने से पहले कुछ करना है या नहीं।

फॉर्मक्लोज़ होता है जब फॉर्म वास्तव में बंद होता है, इसलिए इसे बंद करने के बाद।

क्या इससे मदद मिलती है?

+0

हां, "कास्ट" विचार के लिए धन्यवाद, इसका उपयोग किया था डेल्फी 7 के साथ तकनीक लेकिन सी # – Bohn

+0

में ऐसा करने के लिए भूल गया यह वास्तव में डेल्फी से .NET तक एक बंदरगाह है। =) मुझे खुशी है कि मैंने मदद की! –

+0

जब मैं इस कोड का उपयोग करता हूं तो मुझे ऑब्जेक्ट रेफरेंस ऑब्जेक्ट के इंस्टेंस पर सेट नहीं किया जाता है। –

69

CloseReason गणन आप MSDN पर पाया सिर्फ जाँच उपयोगकर्ता एप्लिकेशन बंद है, या यह आदि एक बंद होने के कारण, या कार्य प्रबंधक द्वारा बंद कर दिया था, कि क्या के उद्देश्य के लिए है ...

आप कर सकते हैं जैसे कारण के अनुसार, विभिन्न कार्यों करते हैं,:

void Form_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if(e.CloseReason == CloseReason.UserClosing) 
     // Prompt user to save his data 

    if(e.CloseReason == CloseReason.WindowsShutDown) 
     // Autosave and clear up ressources 
} 

लेकिन जैसे आप अनुमान लगाया, वहाँ, एक्स बटन पर क्लिक या टास्कबार rightclicking और 'बंद' को क्लिक करके या AltF4 दबा बीच कोई अंतर नहीं, आदि यह सब समाप्त होता है CloseReason.UserClosing कारण में ऊपर।

+6

मानक बंद(); लगता है कि CloseReason.User मेरे लिए बंद कर रहा है। यकीन नहीं है कि क्यों। –

+0

मुझे यह उपयोगी लगता है जब एमडीआई बच्चे के रूप को फॉर्म पर उपयोगकर्ता कार्रवाई द्वारा बंद करने की कोशिश की जा रही है, लेकिन जब माता-पिता को बंद किया जा रहा है। –

+1

यह सवाल का जवाब नहीं देता है, केवल इस मुद्दे को आगे बढ़ाएं। –

35

"एक्स" बटन DialogResult.Cancel के रूप में पंजीकृत है, इसलिए दूसरा विकल्प DialogResult का मूल्यांकन करना है।

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

(उदाहरण: btnSubmit.DialogResult = DialogResult.OK, btnClose.DialogResult = Dialogresult.Abort)

public Form1() 
    { 
     InitializeComponent(); 

     this.FormClosing += Form1_FormClosing; 
    } 

    /// <summary> 
    /// Override the Close Form event 
    /// Do something 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    private void Form1_FormClosing(Object sender, FormClosingEventArgs e) 
    { 
     //In case windows is trying to shut down, don't hold the process up 
     if (e.CloseReason == CloseReason.WindowsShutDown) return; 

     if (this.DialogResult == DialogResult.Cancel) 
     { 
      // Assume that X has been clicked and act accordingly. 
      // Confirm user wants to close 
      switch (MessageBox.Show(this, "Are you sure?", "Do you still want ... ?", MessageBoxButtons.YesNo, MessageBoxIcon.Question)) 
      { 
       //Stay on this form 
       case DialogResult.No: 
        e.Cancel = true; 
        break; 
       default: 
        break; 
      } 
     } 
    } 
+0

मेरे मामले में यह स्वीकृत उत्तर से अधिक उपयोगी है। चूंकि 'एक्स' को DialogResult.Cancel असाइन किया गया है, रद्द बटन पर कुछ अन्य मान असाइन करना आसानी से उन्हें अलग करता है और चीजों को उचित तरीके से संभालता है। – mickeyf

+3

यह मेरे मामले में काम नहीं करता है। 'एक्स' दबाते समय, 'संवाद लॉग'' 'कोई नहीं' रहता है। क्या समस्या हो सकती है? – Bhaskar

+1

@ भास्कर, जब आप अपने संवाद को तुरंत चालू करते हैं, तो अपने संवाद में प्रत्येक बटन पर उपयुक्त संवाद लॉग सेट करना सुनिश्चित करें। मैंने ऊपर एक उदाहरण प्रदान किया था लेकिन संवाद घोषणा दिखाने के लिए कोड ब्लॉक नहीं बनाया था। – AlexScript

1
if (this.DialogResult == DialogResult.Cancel) 
     { 

     } 
     else 
     { 
      switch (e.CloseReason) 
      { 
       case CloseReason.UserClosing: 
        e.Cancel = true; 
        break; 
      } 
     } 

अगर हालत निष्पादित करेंगे जब उपयोगकर्ता क्लिक करता है 'एक्स' या रूप पर बंद करें बटन। अन्यथा उपयोग किया जा सकता है जब उपयोगकर्ता किसी अन्य उद्देश्य के लिए Alt + f4 पर क्लिक करता है

6

यह निर्धारित करता है कि कोई फॉर्म बंद होने पर एप्लिकेशन को बंद करना है (यदि आपका एप्लिकेशन किसी विशिष्ट रूप से संलग्न नहीं है)।

private void MyForm_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     if (Application.OpenForms.Count == 0) Application.Exit(); 
    } 
1

आप इस तरह डिजाइन से ईवेंट हैंडलर जोड़ने की कोशिश कर सकते हैं:, डिज़ाइन दृश्य में खोलें प्रपत्र, खुले गुण खिड़की या F4 दबाएं,, फार्म वस्तु पर घटनाओं को देखने के व्यवहार समूह में FormClosing घटना को खोजने के लिए घटना उपकरण पट्टी बटन पर क्लिक करें और डबल क्लिक करें। संदर्भ: https://social.msdn.microsoft.com/Forums/vstudio/en-US/9bdee708-db4b-4e46-a99c-99726fa25cfb/how-do-i-add-formclosing-event?forum=csharpgeneral

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

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