2010-02-16 18 views
9

मैंने सी # में WinForms प्रोग्राम लिखा है। पासवर्ड फॉर्म में प्रोग्रामेटिक रूप से बटन पर क्लिक करने के लिए।प्रोग्रामेटिक बटन क्लिक 'सिस्टम.स्टैक ओवरफ्लो एक्सेप्शन' अपवाद

Form1 एक संवाद बॉक्स के रूप में Form2 लोड करता है और दिखाता है।

यदि डायलॉग रेसल्ट कुछ अन्य है जो DialogResult.OK है तो एप्लिकेशन बंद हो जाएगा।

अब तक मैं एक बटन क्लिक करें घटना है, जो रूप में कोडित है इस प्रकार है:

if (txtpass.Text == "") 
      { 
       MessageBox.Show("You need to enter a password", "Password", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); 
       txtpass.Focus(); 
      } 
      else 
      { 
       if (txtpass.Text == "1234") 
       { 
        radButton1.DialogResult = DialogResult.OK; 
        radButton1.PerformClick(); 
       } 
       else 
       { 
        MessageBox.Show("Password Incorrect", "Password", MessageBoxButtons.OK, MessageBoxIcon.Error); 
        txtpass.Text = ""; 
        txtpass.Focus(); 
       } 
      } 

मैं radButton1.PerformClick(); उपयोग करें, लेकिन कार्यक्रम चलाने मुझे निम्न संदेश देता है:

An unhandled exception of type 'System.StackOverflowException' occurred in mscorlib.dll 

मैं इस अपवाद को फेंकने के कारण क्या अनिश्चित है।

+0

जोड़ने के लिए भूल निकालने के लिए, इस कोड बटन है कि यह आपको आपको बस इतना करना कोशिश कर रहे हैं बारे में कुछ और पोस्ट कर सकते हैं – Crazyd22

+0

नकल कर रहा है अंदर है? अनिवार्य रूप से ऐसा लगता है कि आप गलत तरीके से समस्या का सामना कर रहे हैं, इसलिए आपकी समस्या। अगर हम जानते हैं कि आप क्या करने की कोशिश कर रहे हैं तो बेहतर तरीके से सुझाव देने में सक्षम हो सकते हैं। – Ian

उत्तर

7

संपादित करें कोई अनुमान नहीं है। अपने आप को अपने आप से क्लिक करने के लिए बटन को बताकर निश्चित रूप से एक अनंत लूप का कारण बनता है। यह विधि को ऊपर और ऊपर कॉल करने का कारण बनता है, ढेर को भरना और इसे बहने का कारण बनता है।

मेरा अनुमान है कि PerformClick() पर कॉल करने से वर्तमान विधि को आप फिर से कॉल करने के लिए पोस्ट कर रहे हैं, इस प्रकार एक अनंत कॉल लूप का कारण बनता है और जिसके परिणामस्वरूप StackOverflowException होता है।

इसे रोकने के लिए, आप तो यह है कि अपने कोड में कहीं तर्क ठीक करने के लिए की जरूरत है:

if (txtpass.Text == "1234") 

false को मूल्यांकन करता है और क्लिक विधि से अधिक से अधिक नहीं बुलाया हो जाता है और। इससे पहले कि आप इसे फिर से क्लिक करने के ठीक पहले txtpass.Text = "" सेट करके इसे प्राप्त कर सकते हैं।

+0

आह मैं देखता हूं, इस बारे में कोई विचार कैसे है? – Crazyd22

+0

"आप शायद txtpass.Text =" "को सेट करके इसे प्राप्त कर सकते हैं इससे पहले कि आप इसे फिर से क्लिक करें।" लेकिन फिर वह "अमान्य पासवर्ड" संदेश बॉक्स फेंक देगा - तो बिंदु क्या है? –

+0

मैं इसे धन्यवाद दूंगा – Crazyd22

1

अंदर आप निम्नलिखित कोड का उपयोग कर से फिर से ईवेंट हैंडलर कॉल करने के लिए:

if (txtpass.Text) 
{ 
    case "1234": 
     radButton1.DialogResult = DialogResult.OK; 

     txtpass.Text = "12345"; 

     radButton1.PerformClick(); 

     break; 

    default: 
     case "12345": 
     break; 

} 
+0

ऐसा इसलिए है क्योंकि मुझे संवाद बटन सेट अप करने की आवश्यकता है, लेकिन मैं पासवर्ड दर्ज करने के बिना ऐसा नहीं करना चाहता हूं, लेकिन इसका मतलब है कि उन्हें इसे दो बार क्लिक करना होगा – Crazyd22

3

आम तौर पर आप मैन्युअल रूप से घटना है कि आप को चलाने के लिए कोशिश कर रहे हैं कहेंगे।

उदा। यदि आप एक विधि

button1_Click(object sender, ButtonEventArgs e) 
{ 
} 

है तो फिर तुम फोन अपने कोड में निम्नलिखित हैं:

button1_Click(this, new ButtonEventArgs()); 

मुझे लगता है कि हो सकता है आप अपने कोड में कुछ तर्क समझाने के लिए हालांकि जरूरत है, यह स्पष्ट है कि तुम क्या नहीं है के रूप में ' करने की कोशिश कर रहे हैं। StackOverflow शायद क्योंकि आप

PerformClick() -> PerformClick() -> PerformClick() कर रहे हैं क्योंकि आपका "1234" टेक्स्ट कॉल के बीच कभी नहीं बदलता है।

+0

यह एक अनंत लूप का भी कारण बनता है अगर इसे बटन 1_Click के भीतर से बुलाया जाता है । –

+0

एंडी, हाँ, मुझे पता है, मेरे जवाब का पहला हिस्सा था ... धन्यवाद :) – Ian

+0

कुछ चरणों में एक पोस्ट का जवाब देने के नुकसान ... – Ian

1

क्या PerformClick() बटन के क्लिक ईवेंट के अंदर है? यदि ऐसा है, तो वह जगह है जहां आप गलत हो रहे हैं क्योंकि आप अपने एप्लिकेशन को अनंत लूप में फेंक रहे हैं।

उपयोगकर्ता बटन पर क्लिक करता
नेट पर क्लिक करें() हैंडलर चलाता है,
बटन PerformClick(),
क्लिक करता है।नेट रन क्लिक करें() हैंडलर,
बटन PerformClick() क्लिक करता है,
नेट पर क्लिक करें() हैंडलर चलाता है,
बटन पर क्लिक करता है PerformClick(),

आदि

form1 निश्चित रूप से है form2 पर ShowDialog() बुला, और बस नहीं Show()?

radButton1.DialogResult के बजाय, this.DialogResult == DialogResult.OK सेट करने का प्रयास करें।

एक बटन पर DialogResult संपत्ति नेट जो DialogResult जब Button क्लिक किया जाता है Form को आवंटित करने के लिए कहता है।

+0

धन्यवाद, लेकिन मैंने समस्या हल की है – Crazyd22

0

एक स्टैक ओवरफ़्लो आमतौर पर होता है क्योंकि विधि अनिश्चित काल तक स्वयं को बुलाती है, क्योंकि हर बार एक विधि कहलाती है, उस बिंदु पर स्टैक में एक प्रविष्टि जोड़ दी जाती है जहां कोई और ढेर नहीं होता है।

प्रत्यावर्तन रोकने के लिए, लाइन radButton1.PerformClick();