2009-02-03 72 views
3

進出口新的節目,我不很懂,但我正在做一個計算器,我想用一個文本框,只有acepts數和小數,而當從剪貼板用戶粘貼文本的文本框中刪除任何文字字符,如MS計算。數字文本框

請花時間來解釋每一個部分,所以我可以學習或寫出來,並告訴我要搜索什麼。

感謝

編輯:我會讓它更加具體:

如何讓C#中的數字文本框?我使用了蒙面文本框,但它不會帶小數。

我讀過的東西有關重載方法的OnKeyPress所以這將糾正任何錯誤的字符,但我不知道該怎麼辦了。

+0

除了印象,這聽起來像一個典型的家庭作業的問題,它也出現利用回答的人(和他/她的時間)是理所當然的。 -1 – Cerebrus 2009-02-03 19:32:58

+0

這是一個足夠公平的問題,我想。 +1 – GWLlosa 2009-02-03 19:45:14

+0

儘管我同意提問者應該更加註意,但沒有清楚的跡象表明這是一個家庭作業問題。 – EBGreen 2009-02-03 19:59:53

回答

4

最簡單的方法:)

的按鍵事件在你的文本框


if ((e.KeyChar <= 57 && e.KeyChar >= 48) || e.KeyChar == 13 || e.KeyChar == 8) 
{ 
} 
else 
{ 
    e.Handled = true; 
} 

0

這裏如何在vb.net做這個

Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged 
    Dim reg As New System.Text.RegularExpressions.Regex("[^0-9_ ]") 
    TextBox1.Text = reg.Replace(TextBox1.Text, "") 
End Sub 

只要解決您的特定的正則表達式需要

0

研究的MaskedTextBox中。

這個問題有點寬泛來解釋一切。如果你想要具體細節,試着重點關注這個問題,因爲你要求很多社區「解釋每個部分」。如果您問幾個具體問題(並排除「請抽空解釋......」),您會得到更好的答覆。

0

據我所知,沒有什麼本地在.NET框架(2.0至少)來做到這一點。您的選擇是:

  1. 創建一個自定義的控制,從文本框控件 繼承和只允許數字輸入。這個 的優點是控制 可以重新使用。
  2. 處理KeyPress事件並檢查 charCode以僅允許數字 擊鍵。這很容易,但很少重複使用。
0

我可能會使用一個正則表達式來篩選出非NUMERICS。

僞代碼:

for (each item in the input string) { 
    if (!match(some regular expression, item)) { 
     toss it out 
    } else { 
     add item to text box or whatever you were going to do with it 
    } 

} 
7

如果你仔細觀察,在Windows計算器,數字顯示在標籤中沒有一個文本框(它不接收焦點)。該窗口接收鍵盤事件。

所以看看窗體上的KeyPressed和KeyDown事件。

0

你可以使用一個簡單的文本框或標籤的計算器顯示屏和公正,確保值(一個字符串?)始終是一個數字。例如,您可以保留一個double,並在想要顯示它時將其轉換爲一個字符串。

-1

作爲一個新手,你可能會更適合投資一個優秀的第三方工具包。來自Telerik的Radcontrol例如有一個數字文本框,可以完成你正在尋找的東西。

2

有一個在框架控制,是專門爲數字輸入製作:NumericUpDown控件。它也管理十進制值。

11

添加的事件處理程序要只能是數字文本框,並添加以下代碼:

private void textBoxNumbersOnly_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    if (Char.IsDigit(e.KeyChar) || e.KeyChar == '\b') 
    { 
     e.Handled = false; 
    } 
    else 
    { 
     e.Handled = true; 
    } 
} 

這使得數字0到9,也只後退(有用恕我直言)允許通過'。'字符,如果你想支持小數十進制數字輸入

1
 if ("1234567890".IndexOf(e.KeyChar.ToString()) > 0) 
     { 
      e.Handled = false; 
     } 
     else 
     { 
      e.Handled = true; 
     } 
0

有用的,但有一些錯誤,如果(右擊和粘貼)的其他文字。 :D

private void textBox1_KeyPress(object sender, KeyPressEventArgs e) 
    { 
     string original = (sender as TextBox).Text; 
     if (!char.IsDigit(e.KeyChar)) 
     { 
      e.Handled = true; 
     } 
     if (e.KeyChar == '.') 
     { 
      if (original.Contains('.')) 
       e.Handled = true; 
      else if (!(original.Contains('.'))) 
       e.Handled = false; 

     } 
     else if (char.IsDigit(e.KeyChar)||e.KeyChar=='\b') 
     { 
      e.Handled = false; 
     } 

    } 
0

這是我根據mahasen的答案製作的自定義控件。把它放在它自己的類文件中,並將命名空間修改爲任何你想要的。一旦你重建你的解決方案,它應該顯示爲你的工具箱菜單標籤中的一個新控件,你可以拖/放到Form

using System; 
using System.Linq; 
using System.Windows.Forms; 

namespace MyApp.GUI 
{ 
    public class FilteredTextBox : TextBox 
    { 
     // Fields 
     private char[] m_validCharacters; 
     private string m_filter; 
     private event EventHandler m_maxLength; 

     // Properties 
     public string Filter 
     { 
      get 
      { 
       return m_filter; 
      } 
      set 
      { 
       m_filter = value; 
       m_validCharacters = value.ToCharArray(); 
      } 
     } 

     // Constructor 
     public FilteredTextBox() 
     { 
      m_filter = ""; 
      this.KeyPress += Validate_Char_OnKeyPress; 
      this.TextChanged += Check_Text_Length_OnTextChanged; 
     } 

     // Event Hooks 
     public event EventHandler TextBoxFull 
     { 
      add { m_maxLength += value; } 
      remove { m_maxLength -= value; } 
     } 

     // Methods 
     void Validate_Char_OnKeyPress(object sender, KeyPressEventArgs e) 
     { 
      if (m_validCharacters.Contains(e.KeyChar) || e.KeyChar == '\b') 
       e.Handled = false; 
      else 
       e.Handled = true; 
     } 
     void Check_Text_Length_OnTextChanged(object sender, EventArgs e) 
     { 
      if (this.TextLength == this.MaxLength) 
      { 
       var Handle = m_maxLength; 
       if (Handle != null) 
        Handle(this, EventArgs.Empty); 
      } 
     } 
    } 
} 

,只是作爲獎金我也想自動標籤到另一個箱子後,我進了3個字符,所以我把盒子的最大長度爲3,在Form代碼我迷上那TextBoxFull事件,並集中在它旁邊的框。這是將4個過濾的框鏈接在一起以輸入IP地址。前兩個箱子形式的代碼如下...

private bool ValidateAddressChunk(string p_text) 
    { 
     byte AddressChunk = new byte(); 
     return byte.TryParse(p_text, out AddressChunk); 
    } 
    private void filteredTextBox1_TextBoxFull(object sender, EventArgs e) 
    { 
     var Filtered_Text_Box = (FilteredTextBox)sender; 

     if (!ValidateAddressChunk(Filtered_Text_Box.Text)) 
      filteredTextBox1.Text = "255"; 
     else 
      filteredTextBox2.Focus(); 
    } 
    private void filteredTextBox2_TextBoxFull(object sender, EventArgs e) 
    { 
     var Filtered_Text_Box = (FilteredTextBox)sender; 

     if (!ValidateAddressChunk(Filtered_Text_Box.Text)) 
      filteredTextBox2.Text = "255"; 
     // etc. 
    }