2014-10-29 41 views
1

我有。 Net簡單text box應用程序,用戶需要添加最多15位數的數字。 如果數字長度小於15,我希望在輸入數字前加零前導零。 例如,如果用戶插入的數目1002我想text box自動添加000000000001002,所以我通過我的text boxTextChanged event嘗試到:通過文本框填充帶前導零的數字TextChanged事件

private void radTextBoxNum_TextChanged(object sender, EventArgs e) 
{ 
    string str = ""; 
    if (radTextBoxNum.Text.Length < 15) 
    { 
     int currentlength = radTextBoxNum.Text.Length; 
     int addZeroes = 15 - radTextBoxNum.Text.Length; 
     for (int i = 0; i < addZeroes; i++) 
     { 
      str += "0"; 
     } 
    } 

    string val = radTextBoxNum.Text; 
    radTextBoxNum.Text = ""; 
    radTextBoxNum.Text = str + val; 
} 

所以我的問題是,插入後一個數字我得到這個錯誤:

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

+0

事件處理程序會更改文本框中的文本,所以它會無限觸發,直到庫存溢出,即不能在其TextChanged事件處理程序中更改TextBox的文本。 – 2014-10-29 16:16:02

+0

所以我可以自動執行,而用戶輸入數字? – 2014-10-29 16:17:40

回答

0

可以爲此在TextChanged事件,只要你阻止事件中所發生的再次調用事件的變化,這是什麼導致你的StackOverflowException。

private void radTextBoxNum_TextChanged(object sender, EventArgs e) { 
    radTextBoxNum.TextChanged -= radTextBoxNum_TextChanged; 
    string text = radTextBoxNum.Text.TrimStart('0'); 
    radTextBoxNum.Text = text.PadLeft(15, '0'); 
    radTextBoxNum.Select(radTextBoxNum.TextLength, 0); 
    radTextBoxNum.TextChanged += radTextBoxNum_TextChanged; 
} 

而不是刪除和添加的處理程序,你可以用一個簡單的形式級變量做到這一點。另外,最好將代碼放在Try ... Catch中......最後,您可以將處理程序添加到Finally塊中,以防止出現錯誤。

0

這是因爲您的文本長度不斷變化,因此int addZeroes = 15 - radTextBoxNum.Text.Length不斷增加。

如果您使用TextChanged事件,您將繼續遇到問題。嘗試使用Validated事件,而不是(在該領域退出):

private void radTextBoxNum_Validated(object sender, EventArgs e) 
{ 
    radTextBoxNum.Text = radTextBoxNum.Text.PadLeft(15, '0'); 
} 
+1

可以將while循環更改爲String.PadLeft(15,'0')。循環串操作是昂貴的。 – muddymess 2014-10-29 16:19:21

+1

可以使用'radTextBoxNum.Text = newValue.PadLeft(15,'0');' – Zack 2014-10-29 16:19:57

+0

從不會對'String.PadLeft()'有所瞭解。 – 2014-10-29 16:23:29