编辑:正如罗布所说,我再次问了一个问题,用新的正确的标题here。
我有一个带有CancelButton和AcceptButton的表单(名为btnCancel和btnOK)。我有一些ComboBoxes作为输入字段。
ComboBox会阻止我的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();
}
}
这是OK按钮的Clicked事件中的代码:
if (!changesAreSaved)
{
SaveChangesToNode();
}
List<int> invalidIndices = ValidateAndRefineNodes(true);
if (invalidIndices.Count == 0)
{
this.DialogResult = DialogResult.OK;
this.Close();
}
else
{
if (nodesToEdit.Count > 1)
{
trvCategories.SelectedNode = trvCategories.Nodes[invalidIndices[0]];
}
FocusOnFirstField(true);
MessageBox.Show(this, "Enter correct values for all fields before you press OK.", "Cannot Save Information",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
一切正常但btnOK_Clicked在显示其MessageBox时被调用两次 。
这是第一次通话的呼叫堆栈:
这是第二次:
如您所见,第二次通话根本不会发生。在第二个调用堆栈中,首先btnOK_Click(第三行)再次从MessageBox.Show(...)调用Fields_KeyDown(第二行)。这怎么可能?我很困惑......
编辑:当我点击“确定”按钮时,一切正常。仅当我按下键盘上的Enter键时才会出现此问题。