2008-10-28 117 views
3

我正在做一個Financial Winforms應用程序,並且在控件中遇到了一些麻煩。Windows窗體中的小數文本框

我的客戶需要在整個地方插入十進制值(價格,折扣等),我想避免一些重複驗證。

因此,我立即嘗試了MaskedTextBox,它適合我的需要(帶有像「€00000.00」的面具),如果它不是面具的焦點和長度。

我無法預測我的客戶將輸入到應用程序中的數字有多大。

我也不能指望他用00開始一切,以得到逗號。一切都應該是鍵盤友好的。

我是否錯過了某些東西,或者根本沒有辦法(除了編寫自定義控件之外)使用標準Windows窗體控件實現此目的?

回答

5

這兩重寫的方法爲我做(免責聲明:此代碼是不是在生產然而,你可能需要修改。)

protected override void OnKeyPress(KeyPressEventArgs e) 
    { 
     if (!char.IsNumber(e.KeyChar) & (Keys)e.KeyChar != Keys.Back 
      & e.KeyChar != '.') 
     { 
      e.Handled = true; 
     } 

     base.OnKeyPress(e); 
    } 

    private string currentText; 

    protected override void OnTextChanged(EventArgs e) 
    { 
     if (this.Text.Length > 0) 
     { 
      float result; 
      bool isNumeric = float.TryParse(this.Text, out result); 

      if (isNumeric) 
      { 
       currentText = this.Text; 
      } 
      else 
      { 
       this.Text = currentText; 
       this.Select(this.Text.Length, 0); 
      } 
     } 
     base.OnTextChanged(e); 
    } 
+0

非常感謝。我用一個自定義控件實現了這個功能,並且對此進行了博客: http://www.tigraine.at/2008/10/28/decimaltextbox-for-windows-forms/ – Tigraine 2008-10-29 09:03:44

5

您將需要一個自定義控件。只需在控件上捕獲Validating事件,並檢查字符串輸入是否可以解析爲小數。

+0

謝謝..這使我的下一個挑戰..創建一個自定義控制* GG * .. – Tigraine 2008-10-28 14:35:04

3

我不認爲你需要一個自定義的控制,只寫了驗證事件的十進制驗證方法,並利用它來進行你需要驗證的所有地方。不要忘記包含NumberFormatInfo,它將處理逗號和數字符號。

+0

有一個自定義的控制準備去會救他一幫樣板代碼隨處可見,他需要這個勾起來:這是一件好事。 – 2008-10-28 14:28:35

0

你只需要通過讓數字和小數點符號,並避免雙十進制符號。另外,這會在開始的十進制數字之前自動加上0。

public class DecimalBox : TextBox 
{ 
    protected override void OnKeyPress(KeyPressEventArgs e) 
    { 
     if (e.KeyChar == ',') 
     { 
      e.KeyChar = '.'; 
     } 

     if (!char.IsNumber(e.KeyChar) && (Keys)e.KeyChar != Keys.Back && e.KeyChar != '.') 
     { 
      e.Handled = true; 
     } 

     if(e.KeyChar == '.') 
     { 
      if (this.Text.Length == 0) 
      { 
       this.Text = "0."; 
       this.SelectionStart = 2; 
       e.Handled = true; 
      } 
      else if (this.Text.Contains(".")) 
      { 
       e.Handled = true; 
      } 
     } 

     base.OnKeyPress(e); 
    } 
}