Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 过滤按键时默认编辑命令在文本框中不起作用_C#_Winforms - Fatal编程技术网

C# 过滤按键时默认编辑命令在文本框中不起作用

C# 过滤按键时默认编辑命令在文本框中不起作用,c#,winforms,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()))

我在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;
            }
    }

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

Ctrl命令不起作用,因为您中止了它们的输入。为了避免这种情况,你必须

检查是否已按下Ctrl键。按键事件并没有告诉你这一点。来自MSDN的这篇文章向您展示了如何执行此操作:编写KeyDown事件脚本以设置或清除一个标志变量,然后可以在KeyPress中测试该变量。不,不完全是优雅的imho,但MS就是这么告诉你的。。请注意,我已经添加了退格代码\b,因为Ctrl检查没有覆盖它。。 或者,如果您想更好地控制允许使用哪些Ctrl键,请跳过整个标志事件,只需将它们逐个包含在允许使用的键括号中,如^C、^X、^A、^V^Z等: 是来自MSDN的描述:

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


另一方面:Ctl Ins和Shift Ins的老式复制粘贴命令即使在原始代码中也能正常工作。

你不是最好的复制粘贴者,是吗?你可能还需要全选和撤消,是吗?是的,在使用按键事件后,textbox的所有默认功能都不起作用,不管这是不是一个好主意,您最好使用TextChanged事件并创建一个验证整个输入的正则表达式。是的,这已解决了复制粘贴剪切问题,但backspace和select all仍不起作用…请参阅我的新版本;我认为简单地包含所有你想使用的Ctrl键是更好的解决方案。是的,这个正则表达式解决方案是最有效的方法…但是Ctrl+A现在仍然不起作用,这很奇怪!它在这里工作得很好!这肯定是另外一回事。。如果您找不到,这可能会有所帮助:private void textBox1\u keydown对象发送者,KeyEventArgs e{If Control.ModifierKeys==Keys.Control&&e.KeyCode==Keys.A{textBox1.SelectAll;e.Handled=true;}
  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;
        }
     }
  }
var regex= new Regex(@"^[0-9,\b\cC\cX\cA\cV\cZ]*$");