繁体   English   中英

如何设置TextBox只接受数字?

[英]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;
    }
}

positionchangeLenght用于将光标保留在还原文本之前的位置。

如果您想接受带小数或大于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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM