Почему обработчик событий FormClosed вызывается дважды? - PullRequest
0 голосов
/ 04 февраля 2019

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

1 Ответ

0 голосов
/ 04 февраля 2019

Больше не вызывать close в событии закрытия.Форма уже закрывается, и ее не нужно закрывать во второй раз.

private void AEModalEditor_FormClosing(object sender, System.ComponentModel.CancelEventArgs e)
{
    if (!_cancelClicked && !SaveClicked)
    {
        if (CancelModalEditor())
        {
            e.Cancel = true;
        }
        else
        {
            _cancelClicked = true;
            // You called Close here again
            Close();
        }
    }
}    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...