【问题标题】:Locking down valid characters in a Textbox锁定文本框中的有效字符
【发布时间】:2010-09-20 03:18:44
【问题描述】:

我需要能够锁定文本框中的有效字符,我目前有一个正则表达式,我可以检查每个字符,例如

[A-Za-z]

将锁定为仅 Alpha 字符。

protected override void OnKeyPress(KeyPressEventArgs e)
{
  if (e.KeyChar == (char)Keys.Back)
  {
    base.OnKeyPress(e);
    return;
  }
  if (String.IsNullOrEmpty(this._ValidCharExpression))
  {
    base.OnKeyPress(e);
  }
  else
  {
    bool isValidChar = Regex.Match(e.KeyChar.ToString(),this._ValidCharExpression).Success;
    if (isValidChar)
    {
      base.OnKeyPress(e);
    }
    else
    {
      e.Handled = true;
    }
  }
}

我已将正则表达式代码放在 OnKeyPress 代码中,但我希望允许所有特殊键,例如 Ctrl-V、Ctrl-C 和 Backspace。

如您所见,我处理了退格键。但是,例如 Ctrl-V 看不到 V 键,因为它为 ctrl 键运行一次,但看不到任何修饰键。

处理这种情况的最佳方法是什么?

【问题讨论】:

  • 在 KeyPresses 上手动操作很难。可以,但必须记住允许所有控制键(退格、删除等)。如果你这样做,至少把它放在一个从 TextBox 派生的新控件中,这样你就可以重用它。或者更好的是,阅读 Tomalak 的答案——这是正确的方法。 :)

标签: c# .net winforms validation textbox


【解决方案1】:

MaskedTextBox 可能适合你。

您还可以在 CodeProjct 上查看FilterTextBox。您可以使用它(或描述的方法)来做您想做的事情。基本思想是在更改变得可见之前取消更改(通过 OnTextChanging 事件)。

【讨论】:

    【解决方案2】:

    如果您将验证放在 OnTextChanged 中而不是 OnKeyPress 中,但每次通过验证时您都将值保存到变量中怎么办?然后,如果用户粘贴或键入了不正确的字符串,您可以还原,并提供一些其他 UI 提示,提示某些内容无效(例如,设置标签的文本)。

    【讨论】:

      【解决方案3】:

      为什么不在 OnTextChanged 事件中检查有效字符

      然后在on键下处理Ctrl+C、Ctrl+V

      您也可以使用 e.ModifierKeys == Keys.Control 来测试控制键

      http://msdn.microsoft.com/en-us/library/system.windows.forms.keypresseventargs.aspx

      【讨论】:

        【解决方案4】:

        您可以使用 OnKeyPress / OnKeyUp / OkKeyDown 事件之一,然后使用 Char.IsLetter 方法检查输入的键是否为字母。

        【讨论】:

          【解决方案5】:

          我想出的解决方案是检查 OnKeyDown 事件中的键,然后设置一个标志是否应该处理按键,然后检查 OnKeyPress 事件。

          protected override void OnKeyDown(KeyEventArgs e)
           {
              Keys keyCode = (Keys)e.KeyValue;
              base.OnKeyDown(e);
              if ((e.Modifiers == Keys.Control) ||
                 (e.Modifiers == Keys.Control) ||
                 (keyCode == Keys.Back) ||
                 (keyCode == Keys.Delete))
              {
                this._handleKey = true;
              }
              else
              {
                // check if the key is valid and set the flag
                this._handleKey = Regex.Match(key.ToString(), this._ValidCharExpression).Success;
              }
            }
          
          
          
          
          protected override void OnKeyPress(KeyPressEventArgs e)
            {
              if (this._handleKey)
              {
                base.OnKeyPress(e);
                this._handleKey = false;
              }
              else
              {
                e.Handled = true;
              }
            }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-01-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-09-18
            • 2014-06-25
            相关资源
            最近更新 更多