为什么AcceptButton被调用两次?

时间:2015-12-01 10:49:42

标签: c# winforms combobox keydown acceptbutton

编辑:正如罗布所说,我再次问了一个问题,用新的正确的标题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时被调用两次

这是第一次通话的呼叫堆栈:

This is Call Stack for first call

这是第二次:

This is Call Stack for second call

如您所见,第二次通话根本不会发生。在第二个调用堆栈中,首先btnOK_Click(第三行)再次从MessageBox.Show(...)调用Fields_KeyDown(第二行)。这怎么可能?我很困惑......

编辑:当我点击“确定”按钮时,一切正常。仅当我按下键盘上的Enter键时才会出现此问题。

0 个答案:

没有答案