过滤KeyPress时,默认编辑命令在TextBox中不起作用

时间:2014-06-18 08:02:16

标签: c# winforms

我的winform中有一个文本框,在使用regex对keypress事件进行验证后,文本框的默认功能(如复制粘贴等)无效。

我该如何处理?

正则表达式使用代码

private void textbox_keypress(object sender,keypresseventargs e)
    {
        var regex= new regex(@"^[0-9,]*$");
        if(!regex.ismatch(e.keychar.tostring()))
            {
                e.handled=true;
            }
    }

删除按键事件处理程序后,一切正常,但我必须限制用户输入逗号分隔的数字值,并在该文本框中复制粘贴删除退格。

1 个答案:

答案 0 :(得分:1)

Ctrl-Commands不起作用,因为您中止了他们的输入。为避免这种情况,您必须

  • 检查是否按下了Ctrl键。 KeyPress事件并没有告诉您这一点。来自MSDN的这个example向您展示了如何执行此操作:您编写KeyDown事件的脚本以设置(或清除)标志变量,然后您可以在KeyPress中进行测试。不,不是那么优雅的imho,但那是MS告诉你怎么做的..(注意我添加了Backspace代码\ b,因为它没有被Ctrl-check覆盖..)

  bool ctrlPressed = false;

  private void textBox1_KeyDown(object sender, KeyEventArgs e)
  {
      ctrlPressed = (Control.ModifierKeys == Keys.Control);
  }

  private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
  {
     if (!ctrlPressed) 
     { 
        var regex= new Regex(@"^[0-9,\b]*$");
        if (!regex.IsMatch(e.KeyChar.ToString()))
        {
           e.Handled = true;
        }
     }
  }
  • ,如果您想要更好地控制允许哪些Ctrl键,请跳过整个标志事件,而只是将它们逐个包含在允许的键括号中,如下所示^ C ,^ X,^ A,^ V ^ Z等......:

var regex= new Regex(@"^[0-9,\b\cC\cX\cA\cV\cZ]*$");

Here是来自MSDN的说明:

  

\ cX匹配ASCII控制字符,其中X是字母的字母   控制角色。例如,\ cC是CTRL-C。

旁注:即使在原始代码中,Ctl-Ins和Shift-Ins的旧式复制和粘贴命令也能正常工作。