[英]How to set TextBox to only accept numbers?
我已经在这里检查了其他问题,但答案与我的问题无关。 以下代码允许textbox1仅在按下物理键盘(笔记本电脑)时接受数字:
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
char ch = e.KeyChar;
if ( !char.IsDigit(ch))
{
e.Handled = true;
}
}
但这不是我想要的(我不使用物理笔记本电脑键盘)。
如屏幕截图所示,我具有带有按钮和文本框的Windows窗体。 我设计了此键盘,它工作良好,但我希望textbox1只接受数字和“。”。
每个按钮(并且项目中只有代码)内只有两行代码,它们是:
private void buttonName_Click(object sender, EventArgs e)
{
// each button only has this code.
textBox1.Focus();
SendKeys.Send(buttonName.Text);
}
我知道如何在按下物理(笔记本电脑)键的情况下将txtbox设置为接受数字,但是在这种情况下,我以windwos形式具有控制按钮,并且我希望将textBox1设置为仅接受数字和“。”。 请帮助如何实现这一目标。 谢谢
在表单级别声明一个字符串变量,使用它存储最后一个有效文本,并在文本框的TextChanged
事件上输入无效文本时将其还原。
string previousText;
public Form1()
{
InitializeComponent();
previousText = String.Empty;
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
int dummy, changeLenght, position;
if (!String.IsNullOrWhiteSpace(textBox1.Text) && !int.TryParse(textBox1.Text, out dummy))
{
position = textBox1.SelectionStart;
changeLenght = textBox1.TextLength - previousText.Length;
textBox1.Text = previousText;
textBox1.SelectionStart = position - changeLenght;
}
else
{
previousText = textBox1.Text;
}
}
position
和changeLenght
用于将光标保留在还原文本之前的位置。
如果您想接受带小数或大于2147483647的数字,只需将dummy
更改为double
并使用double.TryParse
而不是int.TryParse
。
private void textBox1_TextChanged(object sender, EventArgs e)
{
int changeLenght, position;
double dummy;
if (!String.IsNullOrWhiteSpace(textBox1.Text) && !double.TryParse(textBox1.Text, out dummy))
{
...
}
}
假设button1
是您的按钮控件,则可以执行以下操作:
private void allButtons_Click(object sender, EventArgs e)
{
Button btn = sender as Button;
char c = btn.Text[0]; //assuming all buttons have exactly 1 character
if(Char.IsDigit(c) || c == '.')
{
//process
textBox1.Focus();
SendKeys.Send(btn.Text);
}
//otherwise don't
}
我假设您将其放在一个通用处理程序中,您已经将所有按钮(即allButtons_Click
)连接到该处理程序。
这种方法存在问题,它允许您键入0.0.1
类的值,这些值很可能在您的上下文中无效。 解决此问题的另一种方法是处理TextChanged
事件,存储先前的值,如果新值无效,则还原旧值。 不幸的是,TextBox类没有TextChanging
事件,这可能是一个更干净的选择。
确定无效值的好处是模块化。 例如,如果您以后决定用户可以输入任何值,但是只有数字可以通过验证,则可以将检查从TextChanged
移到Validate按钮单击或类似操作。
为什么用户可能想要这样做-假设输入的选项之一是复制/粘贴-他们想粘贴无效的数据并对其进行编辑以变得有效,例如abc123.5
。 如果将它们限制在条目中,则此值将根本不存在,因此,现在需要将它们手动粘贴到记事本中,切出无效字符,然后再次粘贴,这会影响生产率。
通常,在实施任何用户界面限制之前,请阅读“我不会允许我的用户...”,请仔细考虑一下是否足够。 通常,即使出于保持数据库有效的良好目的,也不需要限制用户。如果可能的话,永远不要在其前面放一堵混凝土墙,您只需要在工作流程中正确地指导他们即可。 您希望用户站在您一边,而不是反对您。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.