【问题标题】:Why KeyPressEventArgs's e.Handled does nothing in KeyPressEventArgs C#? [duplicate]为什么 KeyPressEventArgs 的 e.Handled 在 KeyPressEventArgs C# 中什么都不做? [复制]
【发布时间】:2015-10-06 05:11:34
【问题描述】:

这段代码(通过互联网找到)似乎什么也没做。如何防止我的 TextBox

中出现非数字字符
private void textBox1_KeyPress( object sender, KeyPressEventArgs e )
{ 
   if( !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar) )  
      e.Handled = true;
}

e.Handled的真正目的是什么?需要解释。

【问题讨论】:

  • 如果事件没有被处理,将被发送到操作系统进行默认处理。将 Handled 设置为 true 以取消 KeyPress 事件。
  • 告诉我们您面临的具体问题
  • 已经有很多帖子展示了如何让文本框只接受数字输入。
  • @vnikhil 我知道,但我的问题是为什么 e.handled 似乎什么都不做。
  • 调试并检查是否执行

标签: c# key-events


【解决方案1】:

MSDN: KeyEventArgs.Handled Property

true 绕过控件的默认处理;否则,假 还将事件传递给默认控件处理程序。

你想要的是SuppressKeyPress

e.SuppressKeyPress = !(e.KeyValue >= 48 && e.KeyValue <= 57);

防止非数字字符的另一种方法是尝试使用正则表达式

private void textBox1_TextChanged(object sender, EventArgs e)
{
     if (System.Text.RegularExpressions.Regex.IsMatch(textBox1.Text, "[^0-9]"))
     {
          MessageBox.Show("Non numeric character detected.");
          textBox1.Text.Remove(textBox1.Text.Length - 1);
      }
}

你也可以参考这个MSDN forum

.Handled 属性用于通知基类是否 事件已处理或是否需要处理。它 没有传达已处理的击键 keydown/keyup 和按键。它也适用于带有 KeyPreview 的表单 启用,但仅来自 Form.KeyPress 事件的上下文。如果你 有一个设置 .Handled 的 Form.KeyPress 事件,即控件的事件 将被忽略。那里的赠品是 KeyDown 事件处理 一个 KeyEventArgs,其中 KeyPress 事件处理 KeyPressEventArgs。

.SuppressKeyPress 可能就是因为这个原因才被添加的,所以 KeyDown 事件可以覆盖 KeyPress 事件。

【讨论】:

    【解决方案2】:

    如果你想防止 TextBox 中出现非数字字符,那么只需 1 行就足以处理事件

    e.Handled = !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar);
    

    【讨论】:

    • 和我的一样。我的问题是为什么我们需要 e.Handled ,因为它似乎什么也没做。
    • 兄弟,即使我在很多项目中都使用了这个语法,它也能完美运行
    • 很高兴为您提供帮助:)
    • 大错特错。帖子真的值得-1。 :) 请不要冒犯。
    • @vnikhil 这与 -1 或 +1 无关。我澄清了一些信息,发现了我的一个错误。而且我将来不会成功。大多数事情都说,没有冒犯,真正的意思。 :P
    【解决方案3】:

    使用 textBox1_KeyDown

     e.SuppressKeyPress = !(e.KeyValue >= 48 && e.KeyValue <= 57);
    

      if (e.KeyCode < Keys.D0 || e.KeyCode > Keys.D9)
            {
                if (e.KeyCode < Keys.NumPad0 || e.KeyCode > Keys.NumPad9)
                {
                    if (e.KeyCode != Keys.Back)
                    {
                        nonnumberenter = true;
                        string abc = "Please enter numbers only.";
                        DialogResult result1 = MessageBox.Show(abc.ToString(), "Validate numbers", MessageBoxButtons.OK);
                    }
                }
            }
            if (Control.ModifierKeys == Keys.Shift)
            {
                nonnumberenter = true;
                string abc = "Please enter numbers only.";
                DialogResult result1 = MessageBox.Show(abc.ToString(), "Validate numbers", MessageBoxButtons.OK);
    
            }
    

    【讨论】:

    • 我认为您应该更改第一个回答声明。 e.Handle = true 在 KeyDown 中不起作用,因为此事件并非旨在抑制字母数字输入。如果将handled 设置为true,字母数字按键仍将进一步传递。您使用 SuppressKeyPress 的代码可以正常工作。
    • 那为什么要用e.Handled呢?
    • 它将阻止基类对事件进行任何进一步的处理。当您尝试抑制基类中的操作(例如,忽略 KeyDown 中的击键)时,这可能很有用。e.Handled = True 表示取消事件或您在代码中处理事件。
    • 处理退格键也是一个好主意,以防用户输入错误的数字并想要更正它:e.SuppressKeyPress = !((e.KeyValue &gt;= 48 &amp;&amp; e.KeyValue &lt;= 57) || e.KeyValue == 8);
    猜你喜欢
    • 1970-01-01
    • 2018-06-06
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 2016-12-07
    • 2016-06-29
    • 1970-01-01
    • 2018-07-13
    相关资源
    最近更新 更多