2010-02-26 16 views
5

सी # WinForms VS2008कैसे प्रपत्र पर फायरिंग पास

मैं एक विधि के साथ एक फार्म पर एक पाठ बॉक्स textBox1_Leave घटना से बुलाया जा रहा है मिल गया है का उपयोग कर पाठ बॉक्स छुट्टी घटना को रोकने के लिए। विधि टेक्स्टबॉक्स की सामग्री को प्रश्न में लेती है और सामग्री के आधार पर अन्य टेक्स्टबॉक्स को पॉप्युलेट करती है। मेरी समस्या यह है कि उपयोगकर्ता ने टेक्स्ट बॉक्स पर ध्यान केंद्रित किया है, फिर फॉर्म को बंद करने के लिए बटन क्लिक करें (इसे कॉल करें) तो फॉर्म बंद नहीं होता है क्योंकि टेक्स्टबॉक्स छोड़ने की घटना को निकाल दिया जाता है। यदि टेक्स्टबॉक्स में फॉर्म पर फ़ोकस नहीं है तो फॉर्म ठीक से बंद हो जाता है।

यदि उपयोगकर्ता शीर्ष कोने में छोटे एक्स बंद आइकन पर क्लिक करके फ़ॉर्म को बंद कर देता है तो यह टेक्स्टबॉक्स छोड़ने के ईवेंट को निकालकर हर समय ठीक से बंद हो जाता है।

मैं एक्स बंद कार्यक्षमता को कैसे डुप्लिकेट कर सकता हूं ताकि मैं हमेशा टेक्स्टबॉक्स छोड़ने के बिना फ़ॉर्म को बंद कर सकूं?

+0

पर टेक्स्ट बॉक्स छुट्टी घटना में कोड की पंक्ति के बाद यह मेरे लिए महान काम करता है। http://stackoverflow.com/questions/2664639/cancel-leave-event-when-closing –

उत्तर

7

सरल समाधान की जाँच करने के लिए अपने पोस्ट-प्रोसेसिंग करने से पहले जो को नियंत्रित वास्तव में केंद्रित है होने जा रहा है - लेकिन आप Leave हैंडलर में यह नहीं कर सकते, क्योंकि ध्यान अभी भी पाठ बॉक्स पर होगा उस बिंदु पर।

इसके बजाय, आपको अपने तर्क को LostFocus ईवेंट में स्थानांतरित करने की आवश्यकता है, जो डिज़ाइनर में नहीं है। आप क्रम में इसे तार करना होगा:

public class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     textBox1.LostFocus += new EventHandler(textBox1_LostFocus); 
    } 

    private void textBox1_LostFocus(object sender, EventArgs e) 
    { 
     if (closeButton.Focused) 
      return; 
     // Update the other text boxes here 
    } 
} 

LostFocus ईवेंट सक्रिय करने के बाद नए नियंत्रण ध्यान केंद्रित प्राप्त करता होता है।

स्पष्टीकरण - आप मिल सकती है कि यह Leave घटना में इस तर्क डालकर काम करता है - यदि फोकस माउस से बदला गया है। यदि कीबोर्ड का उपयोग इसके बजाए किया जाता है, तो आपको गलत व्यवहार मिल जाएगा। LostFocusदोनों मामलों में विश्वसनीय है - केंद्रित नियंत्रण हमेशा "नया" नियंत्रण हो सकता है। यह एमएसडीएन पर प्रलेखित है: Order of Events in Windows Forms

संयोग से, आपको "लाल एक्स" के साथ इस समस्या का सामना करने का कारण यह नहीं है कि एक्स वास्तव में एक नियंत्रण नहीं है जो फोकस प्राप्त कर सकता है, यह खिड़की का हिस्सा है। जब उपयोगकर्ता उस पर क्लिक करता है, तो यह टेक्स्ट बॉक्स को फोकस खोने का कारण नहीं बना रहा है, और इसलिए Leave ईवेंट को आग लगने का कारण नहीं है।

+0

मैं गलत व्यवहार देने 'छोड़ने' के बारे में टिप्पणी से असहमत हूं, देखें - http://msdn.microsoft.com/en-us/library/system.windows.forms.control.leave.aspx (संयोग से केंद्रित पैरामीटर बदल दिया गया है प्राप्त करने से पहले 'एंटर' का आह्वान किया जाता है, जो घटना क्रम में सबसे पहले आता है) –

+0

आवश्यक कार्यक्षमता के आधार पर, इस दृष्टिकोण के साथ भी समस्या हो सकती है। यदि टेक्स्ट बॉक्स के बाद टैब ऑब्जेक्ट में अगला बटन अगला है, और उपयोगकर्ता टेक्स्ट बॉक्स को छोड़ने के लिए टैब दबाता है, तो यह उन अपडेट्स को रखेगा जो आप चाहते हैं, भले ही वे होना चाहिए। –

+0

मैं इस तरह से जाने देता हूं और देखता हूं कि इनपुट – Spooky2010

0

आप यह देखने के लिए जांच सकते हैं कि कौन से नियंत्रण पर ध्यान केंद्रित किया गया है।

private void textBox1_Leave(object sender, EventArgs e) 
{ 
    if (btnClose.Focused) 
     return; 
    // go from here 
} 
+0

आप करीब हैं - लेकिन 'छोड़ें' ईवेंट में फ़ोकस अभी तक नहीं बदला है। – Aaronaught

2

एक और दृष्टिकोण: टेक्स्ट छोड़ने की घटना के बजाय टेक्स्टबॉक्स की मान्य घटना का उपयोग करें, फिर बटन के कारणों की वैधता संपत्ति को झूठी में बदलें। बटन के क्लिक इवेंट में सत्यापन के कारण आपको टेक्स्टबॉक्स भी सेट करना होगा ताकि फ़ॉर्म बंद होने पर वैध ईवेंट आग नहीं लगेगा (धन्यवाद @Powerlord को इंगित करने के लिए धन्यवाद)।

private void button1_Click(object sender, EventArgs e) 
{ 
    this.textBox1.CausesValidation = false; 
    this.Close(); 
} 
1

तुम भी FormClosing घटना को संभालने और यह सुनिश्चित करें e.Cancel तर्क फार्म पर अन्य नियंत्रण पर मान्य घटनाओं से सही पर सेट नहीं प्राप्त करता है बना सकते हैं। मुझे लगता है कि फॉर्मक्लोजिंग इवेंट से पहले उन्हें निकाल दिया जाएगा।

private void MainForm_FormClosing(object sender, FormClosingEventArgs e) 
     { 
      if (e.CloseReason == CloseReason.UserClosing) 
      { 
       e.Cancel = false; 
       return; 
      } 
     } 
+0

स्वच्छ दृष्टिकोण, जैसे^_ ^ – chad

0

बस जांचें कि टेक्स्टबॉक्स का स्वामित्व वाला फॉर्म निपटान कर रहा है या नहीं? अगर यह बंद हो रहा है, तो यह निपटान कर रहा है। यदि यह निपटान कर रहा है तो आप कुछ भी किए बिना परेशान 'छुट्टी' घटना को समाप्त कर सकते हैं। मैंने इसे जांच नहीं लिया और मुझे माफ कर दिया, मुझे अपनी खुद की एक परियोजना पर दबा दिया गया है और मैं खुद को खोज रहा था, इसलिए मुझे नहीं लगता कि मेरे पास समय होगा।

private void GuiltyTextBox_Leave(object sender, EventArgs e) { 
    Form formOwningTheTextBox=(Form)((Control)sender).TopLevelControl; 
    if (formOwningTheTextBox.Disposing || formOwningTheTextBox.IsDisposed) return; 
    ....... 
} 

मुझे विश्वास है कि यह न्यूनतम प्रयास के साथ काम करने जा रहा है और मैं अपना उत्तर खोजना शुरू करने से पहले एक त्वरित उत्तर भेजना चाहता हूं।

0

लिखें शीर्ष

if me.closing then 
return 
end if 
संबंधित मुद्दे