首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 僅允許數字輸入的 TextBox 五大方案:ES_NUMBER、KeyDown 驗證、MaskedTextBox、NumericUpDown 與自訂控制項

     編輯:關於C#

方案對照表

方案實現難度支援貼上驗證支援負數/小數/千分位適用場景
1. ES_NUMBER 風格⭐❌❌極簡整數輸入
2. KeyDown/KeyPress 驗證⭐⭐❌可擴充需自訂規則(如十六進位)
3. MaskedTextBox⭐✅✅ (遮罩模式)固定格式(電話、IP、金額)
4. NumericUpDown⭐✅✅ (內建)範圍限制、步進調整
5. 繼承 TextBox 重寫 CreateParams⭐⭐❌❌可複用元件庫

方案 1:ES_NUMBER(最省碼)


public class NumericTextBox : TextBox
{
    private const int ES_NUMBER = 0x2000;
    protected override CreateParams CreateParams
    {
        get
        {
            var cp = base.CreateParams;
            cp.Style |= ES_NUMBER;
            return cp;
        }
    }
}
// 使用:this.Controls.Add(new NumericTextBox { Dock = DockStyle.Fill });

原理:設定 Windows 編輯控制項風格,系統自動攔截非數字鍵。缺點:Ctrl+V 貼上非數字仍會進入(但不顯示),需額外處理 TextChanged。

方案 2:KeyDown + KeyPress 手動驗證


private bool nonNumber;
private void txt_KeyDown(object sender, KeyEventArgs e)
{
    nonNumber = !(e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9 ||
                  e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9 ||
                  e.KeyCode == Keys.Back);
}
private void txt_KeyPress(object sender, KeyPressEventArgs e)
{
    if (nonNumber) e.Handled = true;
}

可擴充支援負號、小數點、Hex 字元等。

方案 3:MaskedTextBox(內建格式化)


var mtb = new MaskedTextBox
{
    Mask = "999,999.00", // 6 位整數、千分位、2 位小數
    PromptChar = ' ',
    InsertKeyMode = InsertKeyMode.Overwrite
};
mtb.MaskInputRejected += (s, e) => toolTip.Show("僅限數字", mtb, 2000);

優點:視覺提示(佔位符)、自動插入分隔符、貼上自動過濾。

方案 4:NumericUpDown(最推薦通用數值輸入)


var nud = new NumericUpDown
{
    Minimum = 0,
    Maximum = int.MaxValue,
    DecimalPlaces = 2,
    ThousandsSeparator = true,
    Increment = 1,
    Value = 100
};
// 取值:nud.Value (decimal)

內建上下鍵步進、範圍限制、千分位、鍵盤輸入驗證,零程式碼即達生產級。

方案 5:可複用元件庫(CodeProject 精選)

  • Validating Edit Controls:NumericTextBox、AlphanumericTextBox、DateTextBox 完整原始碼。
  • Numeric TextBox with a twist:支援科學記號、單位後綴。

選型建議

  1. 單純整數、不介意貼上問題 → ES_NUMBER 或 NumericUpDown。
  2. 金額、電話、IP 等固定格式 → MaskedTextBox。
  3. 需範圍、步進、小數位 → NumericUpDown 首選。
  4. 極度客製化(如十六進位、科學記號) → 繼承 TextBox 覆寫 OnKeyDown/OnTextChanged 或引用成熟庫。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved