Изменить: как сказал Роб, я снова задал вопрос с новым и правильным заголовком здесь.
У меня есть форма с 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 на клавиатуре.