我需要创建一个仅包含数字的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);
}
}
答案 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
。
最好使用TextChanging
和BeforeTextChanging
,因为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¶m2[property22]=value22¶m3[property3][]=[value31,value32]
作为特殊情况,可能必须处理退格字符
答案 3 :(得分:0)
基于此问题的答案 https://stackoverflow.com/a/52624310/13814517。
如果您还想允许像 100.0 这样的输入,您可能会遇到小数点问题。 所以
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”。