【问题标题】:Why does the PreviewKeyDown event get called a second time when IsInputKey is set true?当 IsInputKey 设置为 true 时,为什么会再次调用 PreviewKeyDown 事件?
【发布时间】:2012-08-10 14:36:21
【问题描述】:

VS2010 C# .Net 4.1

我正在处理一个表单,用户必须在ComboBox 中选择或输入初始数据。使用下面的代码,这需要一些时间来推断,如果数据正确,当用户点击Tab 键时,我启用编辑按钮,否则按钮被禁用,它会移动到下一个按钮。

此代码有效,但副作用是当我将IsInputKey 设置为true 时PreviewKeyDown 事件再次发生。这会调用两次验证。 KeyDown 事件只被调用一次,IsInputKey 在第二次调用时再次为假,所以我需要再次检查验证。

我想了解原因并可能避免它。

private void comboBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { 
  if (e.KeyData == Keys.Tab) { 
    if (ValidationRoutine()) { 
      e.IsInputKey = true;  //If Validated, signals KeyDown to examine this key 
    } //Side effect - This event is called twice when IsInputKey is set to true 
  }           
} 

private void comboBox1_KeyDown(object sender, KeyEventArgs e) { 
  if (e.KeyData == Keys.Tab) { 
      e.SuppressKeyPress = true; //Stops further processing of the TAB key 
      btnEdit.Enabled = true; 
      btnEdit.Focus(); 
  } 
} 

【问题讨论】:

  • 您是否尝试过删除 PreviewKeyDown 中的代码并将代码添加到不同的事件处理程序中。PreviewKeyDown 在实际 KeyDown 事件之前发生/被触发。
  • @DJ KRAZE-这是允许在 KeyDown 事件中抑制 Tab 的必要条件。如果我不按下它,焦点将移至顺序中的下一个按钮,因为我的目标按钮没有及时启用。我可以在其他地方进行全面验证,并为这个测试检查一个简单的标志。但我想知道为什么它被调用了两次。

标签: c# winforms events


【解决方案1】:

为什么?很难回答,Winforms 就是这样。首先来自消息循环,再次来自控件的消息调度程序。该事件实际上是一种实现受保护的 IsInputKey() 方法的替代方法,而无需重写控件类。有点hack,我总是覆盖并且从未使用过该事件。

更好的鼠标陷阱是替代 ProcessCmdKey()。像这样:

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
        if (this.ActiveControl == comboBox1 && keyData == Keys.Tab) {
            if (ValidationRoutine()) {
                btnEdit.Enabled = true;
                btnEdit.Focus();
                return true;
            }
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }

【讨论】:

  • 这甚至可以在启用自动完成的情况下使用。你介意在我原来的问题上发布这个答案吗:stackoverflow.com/questions/11895235。谢谢!我在这个次要的 UI 功能上花费了太多时间,但现在它将适用于未来的任何事情!
猜你喜欢
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-16
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多