我有一个带有 CancelButton 和 AcceptButton 的表单(名为 btnCancel 和 btnOK)。我有一些组合框作为输入字段。
组合框阻止我的 AcceptButton 和 CancelButton 接收 Escape 和 Enter 键,因此我将此代码添加到所有字段的 KeyDown 事件中:
if (e.KeyData == Keys.Escape)
{
ComboBox field = (ComboBox)sender;
if ((field.DropDownStyle == ComboBoxStyle.Simple) || (!field.DroppedDown))
{
e.SuppressKeyPress = true;
btnCancel.PerformClick();
}
}
else if (e.KeyData == Keys.Enter)
{
ComboBox field = (ComboBox)sender;
if ((field.DropDownStyle == ComboBoxStyle.Simple) || (!field.DroppedDown))
{
e.SuppressKeyPress = true;
btnOK.PerformClick();
}
}
这是“确定”按钮的 Clicked 事件中的代码:
if (!changesAreSaved)
{
SaveChangesToNode();
}
List<int> invalidIndices = ValidateAndRefineNodes(true);
if (invalidIndices.Count == 0)
{
this.DialogResult = DialogResult.OK;
this.Close();
}
else
{
MessageBox.Show(this, "Enter correct values for all fields before you press OK.", "Cannot Save Information",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
一切正常,但是当 ComboBox 具有焦点并且我按键盘上的 Enter 键时,btnOK_Clicked 再次调用 Fields_KeyDownonly当它显示它的 MessageBox 时(在 if 的 else 部分)。就在调用 MessageBox.Show(...) 后,KeyDown 事件在没有任何原因的情况下第二次被调用。
这是第一次调用的调用堆栈:
这是第二个:
第二次调用根本不应该发生。在第二个调用堆栈中,首先 btnOK_Click (第三行)再次调用 Fields_KeyDown (第二行)来自 MessageBox.Show(...)。这怎么可能?我很困惑...
第二次调用的调用堆栈,外部代码可见: