4

VS2010 C# .Net 4.1

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

此代码有效,但副作用是当我设置为 truePreviewKeyDown时事件再次发生。IsInputKey这会调用两次验证。该KeyDown事件仅被调用一次,并且IsInputKey在第二次调用时再次为 false,因此我确实需要再次检查验证。

我想了解为什么并可能避免它。

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(); 
  } 
} 
4

1 回答 1

5

为什么?很难回答,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);
    }
于 2012-08-10T15:02:06.357 回答