在C#中限制文本框输入为数字

4

我想在C#中限制文本框只接受数字。我该怎么做?


15
HTML?Windows Forms?WPF?Silverlight? - Mark Seemann
1
如果涉及到C#,也许这是一个愚蠢的建议,但请评估NumericUpDown控件是否适合。 - Niki Romagnoli
10个回答

15

最原始且不太规范的做法是像这样做:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        this.textBox1.KeyPress += new KeyPressEventHandler(textBox1_KeyPress);
    }

    private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        e.Handled = !char.IsDigit(e.KeyChar);
    }

}

即使采用此方法,您仍不安全,因为用户仍然可以将非数字字符复制并粘贴到文本框中。 无论如何,您仍需要验证数据。


5
用户也无法删除角色。 - Lucas B
@LucasB,除非他们切断。 :) - Tyler Crompton
这很好用,我唯一建议的更改是也启用退格键字符: - Mike Bruno
2
这个很好,我唯一建议的更改是同时启用退格键:private void textBox1_KeyPress(object sender, KeyPressEventArgs e) { e.Handled = !(char.IsDigit(e.KeyChar) || e.KeyChar==8); } - Mike Bruno

4

根据其他人之前所说,我们必须几乎知道您将在哪里使用此功能,WinForms、ASP.NET、Silverlight等等...

但现在我猜测您是在使用WinForm :)

private void TxtBox1_KeyPress(object sender, KeyPressEventArgs e)
{
     if (!System.Text.RegularExpressions.Regex.IsMatch(e.KeyChar.ToString(), "\\d+"))
          e.Handled = true;
}

这不允许使用退格键。 - simon.d
这也不是被要求的内容。但如果你需要的话.. 如果 (e.KeyChar= vbKeyBack) {return;} - eriksv88

2

虽然存在一些错误,但解决方法很简单 :D

 private void textbox1_TextChanged(object sender, EventArgs e)
        { 
            char[] originalText = textbox1.Text.ToCharArray();
            foreach (char c in originalText)
            {
                if (!(Char.IsNumber(c)))
                {
                    textbox1.Text = textbox1.Text.Remove(textbox1.Text.IndexOf(c));
                    lblError.Visible = true;
                }
                else
                    lblError.Visible = false;
            }
            textbox1.Select(textbox1.Text.Length, 0);
        }

1

这可能不是最好的方法,但对于 WPF TextBox 来说还可以...

    private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
    {
        string originalText = ((TextBox)sender).Text.Trim();
        if (originalText.Length>0)
        {
            int inputOffset = e.Changes.ElementAt(0).Offset;
            char inputChar = originalText.ElementAt(inputOffset);
            if (!char.IsDigit(inputChar))
            {
                ((TextBox)sender).Text = originalText.Remove(inputOffset, 1);
            }
        }
    }

1
你尝试过在WinForms中使用MaskedTextBox控件吗?

1

0

不确定这是否是正确的方法,但它对我有效,在TextChanged事件上运行TextBox:

    private void CoordinateValidation(object sender, TextChangedEventArgs e) {
        TextBox inputBox = e.OriginalSource as TextBox;
        inputBox.TextChanged -= CoordinateValidation;
        int caretPos = inputBox.CaretIndex;
        foreach (TextChange change in e.Changes) {
            if (inputBox.Text.Substring(change.Offset, change.AddedLength).Any(c => !ValidChars.Contains(c)) ||
                inputBox.Text.Count(c => c == '.') > 1 ||
                (inputBox.Text.Length > 0 && inputBox.Text.Substring(1).Contains('-'))) {
                inputBox.Text = inputBox.Text.Remove(change.Offset, change.AddedLength);
                caretPos -= change.AddedLength;
            }
        }
        inputBox.CaretIndex = caretPos;
        inputBox.TextChanged += CoordinateValidation;
    }

0
你可以使用 Microsoft.VisualBasic.Information.IsNumeric 函数来判断是否为数字。只需添加 Microsoft.VisualBasic 引用即可。
private void textBox1_Validating(object sender,
        System.ComponentModel.CancelEventArgs e) {
    if (!Microsoft.VisualBasic.Information.IsNumeric(textBox1.Text)) {
        e.Cancel = true;
    } else {
        // Do something here
    }
}

这允许用户输入科学计数法,而这并不容易过滤。


0
请看下面的代码。
private void txtbox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        const char Delete = (char)8;
        e.Handled = !Char.IsDigit(e.KeyChar) && e.KeyChar != Delete;
    }

这将会很有帮助,但用户可以复制和粘贴字符 :-)


0
你可以使用 AJAX 控制工具包的 FilterTextBox。使用它,你可以允许/禁止任何字符类型。这非常灵活。

为什么要使用外部工具,而不是使用内置工具就可以完成的事情? - Oliver Friedrich
如果他在这里谈论Web,那么只需在普通的文本框中创建一个JavaScript函数,以便只能输入数字。然后当然会在服务器端进行检查。对于客户端来说永远不会是安全的,因为您可以使用相同的标头发送请求。我不认为在这里使用ajax有任何优势... - eriksv88
优点在于只需将控件拖放到页面上并忘记它,特别是如果您已经在使用Ajax Control Toolkit。 - paulH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接