如何将TextBox设置为仅接受数字?

时间:2015-11-21 12:59:07

标签: c# winforms

我已经在这里检查了其他问题,但答案与我的问题无关。如果按下物理键盘(笔记本电脑),以下代码允许textbox1仅接受数字:

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

            e.Handled = true;
        }
    }

但这不是我想要的(我不使用实体笔记本键盘)。

ScreenShot

如屏幕截图所示,我有带按钮和文本框的窗体。我设计了这个键盘,它运行良好,但我希望textbox1只接受数字和“。”。

每个按钮内只有两行代码(只有项目中的代码):

private void buttonName_Click(object sender, EventArgs e)
    {    
         // each button only has this code.

         textBox1.Focus();
         SendKeys.Send(buttonName.Text);  
    }

我知道如果按下物理(笔记本电脑)键,如何设置txtbox接受数字,但在这种情况下,我有windwos形式的控制按钮,我想将textBox1设置为仅接受数字和“。”。请帮助我们如何实现这一目标。谢谢

2 个答案:

答案 0 :(得分:2)

在表单级别声明一个字符串变量,用它来存储最后一个有效文本,并在文本框的@Override public boolean onPrepareOptionsMenu(Menu menu) { MenuItem prefs = menu.findItem(R.id.prefs); // your item identifier prefs.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { doThis(); return false; } }); } 事件中输入无效文本时将其恢复。

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用于在恢复文本之前将光标保持在原位。

如果您想接受带小数或大于2147483647的数字,只需将changeLenght更改为dummy并使用double代替double.TryParse

int.TryParse

答案 1 :(得分:1)

假设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移至验证按钮点击或类似。

为什么用户可能需要 - 假设其中一个输入选项是复制/粘贴 - 他们希望粘贴无效数据并将其编辑为有效,例如abc123.5。如果你在条目中限制它们,那么这个值根本就不存在,因此它们现在需要手动粘贴到记事本中,剪切出无效字符,然后重新粘贴,这会影响生产力。

通常,在实现任何用户界面限制之前,请阅读“我不允许我的用户......”,请仔细考虑,是否足够合理。通常情况下,您不需要限制用户,即使是为了保持您的数据库有效等目的。如果可能的话,永远不要在他们面前放置混凝土墙,您只需要在工作流程中正确引导它们。您希望用户站在您一边,而不是反对您。