仅数字的文本框

时间:2018-10-03 09:37:21

标签: c# xaml uwp

我需要创建一个仅包含数字的TextBox,但是我做不到。 我试过了:InputScope =“ Numbers”,但这仅适用于Mobile。 我也尝试过TextChanging

private void textBox1_TextChanged(object sender, EventArgs e)
{
    if (System.Text.RegularExpressions.Regex.IsMatch(textBox1.Text, "[^0-9]"))
    {

        textBox1.Text = textBox1.Text.Remove(textBox1.Text.Length - 1);
    }
}

5 个答案:

答案 0 :(得分:3)

您可以阻止任何非数字输入,也可以只过滤掉文本中的数字。

防止非数字输入

使用BeforeTextChanging事件:

<TextBox BeforeTextChanging="TextBox_OnBeforeTextChanging" />

现在处理如下:

private void TextBox_OnBeforeTextChanging(TextBox sender,
                                          TextBoxBeforeTextChangingEventArgs args)
{
    args.Cancel = args.NewText.Any(c => !char.IsDigit(c));
}

此LINQ表达式将返回true,因此如果在输入中遇到任何非数字字符,则Cancel会更改文本。

过滤非数字输入

使用TextChanging事件:

<TextBox TextChanging="TextBox_OnTextChanging" /> 

并以这种方式处理:

private void TextBox_OnTextChanging(TextBox sender, TextBoxTextChangingEventArgs args)
{
    sender.Text = new String(sender.Text.Where(char.IsDigit).ToArray());
}

此LINQ查询将过滤掉非数字字符并仅使用输入中的数字来创建新的string

最好使用TextChangingBeforeTextChanging,因为TextChanged发生得太晚了,因此看到文字暂时显示在屏幕上并立即消失,会使用户感到困惑。

答案 1 :(得分:0)

除了TextBox.Text.Remove函数(Substring函数)以外,您还可以执行其他操作,并且在复制包含在字符串中心的字母的一系列字符时,也应解决此问题:-

private void textBox1_TextChanged(object sender, EventArgs e)
{
    var txt = textBox1.Text;

        if (System.Text.RegularExpressions.Regex.IsMatch(txt, "[^0-9]"))
        {
            for (int i = 0; i < txt.Length; i++)
                if (!char.IsDigit(txt[i]))
                    if (i != txt.Length - 1)
                    {
                        //If he pasted a letter inclusive string which includes letters in the middle
                        //Remove the middle character or remove all text and request number as input
                        //I did the second way
                        textBox1.Text = "";
                        break;
                    }
                    else
                    {
                        //If he just typed a letter in the end of the text
                        textBox1.Text = txt.Substring(0, txt.Length - 1);
                        break;
                    }
        }
}

答案 2 :(得分:0)

这是一个没有字符串匹配的O(1)解决方案

param1=value1&parm2[property21]=value21&param2[property22]=value22&param3[property3][]=[value31,value32]

作为特殊情况,可能必须处理退格字符

答案 3 :(得分:0)

基于此问题的答案 https://stackoverflow.com/a/52624310/13814517

如果您还想允许像 100.0 这样的输入,您可能会遇到小数点问题。 所以

  1. 在文本框上启用私有 OnBeforeTextChanging 事件
  2. 在处理程序中:
private void TextBox_OnBeforeTextChanging(TextBox sender,
                                          TextBoxBeforeTextChangingEventArgs args)
{
    double tempDouble;
    args.Cancel  = !(double.TryParse(args.NewText, out tempDouble) | args.NewText == "");

}

答案 4 :(得分:0)

如果您必须使用 TextChanged 事件,则基于接受的答案的过滤文本解决方案:

private void HexTextBox_TextChanged(object sender, EventArgs e)
{
    if (!(sender is TextBox txt))
        return;

    // Filter out any invalid chars that are typed/pasted and leave the cursor where it was (or reasonably close).
    int pos = txt.SelectionStart;
    txt.Text = string.Concat(txt.Text.Where(c => "0123456789abcdefABCDEF".IndexOf(c) != -1));
    txt.SelectionStart = pos;
}

这使得某人无法在文本框中键入不需要的字符。如果他们粘贴它们,它们将被忽略。例如。对于上述情况,如果您尝试粘贴“12#45^”,您最终会在 TextBox 中得到“1245”。