StackOverflow может быть неправильным местом для вопроса «почему», но я ищу ответ «потому что», а не «как ответить».Я уже обошел проблему, отключив обработчик в хандере.
Приложение имеет DataGridView, который отображает информацию инвентаризации во время входящей проверки.Сетка данных слишком широка для экрана и требует горизонтальной прокрутки.Для облегчения просмотра и редактирования данных был добавлен модальный редактор.Для закрытия модального редактора есть 2 кнопки: «Сохранить» или «Отмена».Использование кнопки закрытия в правом верхнем углу формы модального редактора должно выполнить то же действие, что и кнопка отмены.
При нажатии кнопки отмены все работает нормально.При нажатии кнопки «Закрыть» модальный редактор FormClosed событие запускается дважды.Почему модальный редактор FormClosed событие запускается дважды?Есть ли в моем коде ошибка?
private bool CancelModalEditor()
{
bool cancelled = false;
string cancelMsg = (_cancelClicked) ? "Canceling" : "Closing";
cancelMsg += " the editor will delete the Record with Serial Number: " + SerialNumber + " from the Audit Session. Is this what you want to do?";
DialogResult dlg = MessageBox.Show(cancelMsg, "", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (dlg == DialogResult.Yes)
{
SaveClicked = false;
}
else
{
cancelled = true;
}
return cancelled;
}
private void AEMEBtn_Cancel_Click(object sender, EventArgs e)
{
_cancelClicked = true;
if (!CancelModalEditor())
{
Close();
}
else
{
_cancelClicked = false;
}
}
private void AEModalEditor_FormClosing(object sender, System.ComponentModel.CancelEventArgs e)
{
if (!_cancelClicked && !SaveClicked)
{
if (CancelModalEditor())
{
e.Cancel = true;
}
else
{
_cancelClicked = true; // Prevent Infite Loop
Close();
}
}
}
Файл, в котором вызывается модальный редактор.
private void ModalEditorForm_Closed(object sender, FormClosedEventArgs e)
{
AEModalEditor modalEditor = (AEModalEditor)sender;
int currentRow = modalEditor.RowID - 1;
if (modalEditor.SaveClicked)
{
UpdateDataGridRowWithModalEditorValues(dgAssetDetails, currentRow, modalEditor.AssetControlsValues);
updateAuditDetailsDataGridRow(currentRow, modalEditor.AuditControlsValues);
UpdateAuditTextFields(modalEditor);
SelectAllCellsInRow(currentRow);
}
else
{
DeleteRowFromAllDataGridViews(modalEditor.SerialNumber, currentRow);
_previouslySelectedRow = -1;
}
// Save all records in either case so that session data isn't lost.
save(false);
_currentlySelectedDataGrid = DataGrids.None;
_modalEditorOpen = false;
txtSerialNumber.Focus();
}