2010-02-16 90 views
9

我已經在C#.Net中編寫了一個WinForms程序,以便在密碼錶單中以編程方式單擊按鈕。Programmatic button click throws'System.StackOverflowException'exception

Form1加載並顯示Form2作爲對話框。

如果DialogResult是其他任何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

通常你會手動調用您嘗試運行的事件。

E.g.如果你有一個方法

button1_Click(object sender, ButtonEventArgs e) 
{ 
} 

那麼你會調用你的代碼如下:

button1_Click(this, new ButtonEventArgs()); 

我想也許你需要,雖然解釋你的代碼中的一些邏輯,目前還不清楚是什麼你」重新嘗試去做。 StackOverflow可能是因爲你在做

PerformClick() - > PerformClick() - > PerformClick()因爲你的「1234」文本在調用之間永遠不會改變。

+0

如果從Button1_Click中調用它,也會導致無限循環。 –

+0

安迪,是的,我知道,只是我的答案的第一部分...謝謝:) – Ian

+0

在幾個階段回答帖子的缺點... – Ian

1

按鈕的點擊事件中是否有PerformClick()?如果是這樣,那就是你錯誤的地方,因爲你將應用程序投入無限循環。

用戶點擊按鈕,
.NET運行點擊()處理器,
按鈕點擊PerformClick()
。NET運行點擊()處理器,
按鈕點擊PerformClick()
.NET運行點擊()處理器,
按鈕點擊PerformClick()

form1絕對呼籲form2ShowDialog(),並不僅僅是Show()

而不是radButton1.DialogResult,請嘗試設置this.DialogResult == DialogResult.OK

按鈕上的DialogResult屬性告訴.NET當點擊Button時,哪個DialogResult分配給Form

+0

謝謝,但我已經排序問題 – Crazyd22

0

堆棧溢出的發生通常是因爲方法無限期地調用它自己,因爲每次調用一個方法時,都會將一個條目添加到堆棧中,直到沒有剩餘堆棧爲止。

要停止遞歸,刪除行radButton1.PerformClick();