2016-05-13 79 views
-2

我很快做出了一個Windows窗體項目,它加載了一個帶有浮點值的不同文本框的GUI。其中一些確實已經初始化了一個值。所有文本框都必須在更改其中一個文本框後進行更新。Windows窗體無限循環異常

public Form1() 
{ 
    InitializeComponent(); 
    initializeValues(); 
    calculateValues(); 
} 

public void initializeValues() 
{ 
//textboxes are filled/initialized with default float values 
} 

public void calculateValues() 
{ 
//here all textboxes are new calculated and updated 
} 

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    calculateValues(); 
} 

private void textBox2_TextChanged(object sender, EventArgs e) 
{ 
    calculateValues(); 
} 

問題: 當我執行這個項目,它拋出我這是一個unhandeled StackOverflowException(無限循環或無限遞歸)。我認爲這是因爲在calculateValues()方法中,文本框的文本將被改變,然後事件處理程序被激活。這是:-(

我如何改變我上面的代碼結構來避免這種情況的無限循環

感謝

+1

設置斷點,遍歷代碼,你會發現你的懷疑是正確的。只需退訂該活動,並在更改後重新訂閱。 – CodeCaster

+0

當引發Win32異常時,將您的IDE設置爲中斷。你會在你面前有整個callstack,立即放棄,爲什麼你有一個無限循環/無限遞歸。 – IInspectable

回答

0

你不應該使用,並呼籲?「initializeValues();」(的原因。無限循環)

第一種解決方案可以是把一個文本框的初始化值中的InitializeComponent:

MyTextBox.Text = myInitValue;

+0

爲什麼常規的非遞歸函數調用會導致堆棧溢出或無限循環?你很容易跳到結論。 – IInspectable

0

我通過將事件更改爲「KeyPress」來解決問題。在這種情況下,事件不會由方法本身激活。沒有更多的無限循環。設置斷點並逐步幫助我理解「流程」。感謝CodeCaster。