Почему AcceptButton вызывается дважды?

Изменить: как сказал Роб, я снова задал вопрос с новым и правильным заголовком здесь.

У меня есть форма с CancelButton и AcceptButton (с именами btnCancel и btnOK). И у меня есть несколько ComboBox в качестве полей ввода.

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

Это код в событии Clicked кнопки OK:

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 (третья строка) снова вызывает Fields_KeyDown (вторая строка) из MessageBox.Show(...). Как это возможно? Я в замешательстве...

Изменить: когда я нажимаю кнопку ОК, все в порядке. Эта проблема возникает только тогда, когда я нажимаю Enter на клавиатуре.


person h.nodehi    schedule 01.12.2015    source источник