【问题标题】:Why Does the FormClosed Event Handler Get Called Twice?为什么 FormClosed 事件处理程序会被调用两次?
【发布时间】:2019-02-05 00:53:23
【问题描述】:

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

【问题讨论】:

  • 不要再次调用close。
  • @DanielA.White 据我所知,我只调用一次。
  • 是的。在AEModalEditor_FormClosing 中,表单已经关闭(无论出于何种原因)。然后在 else 分支中再次调用 Close()。为什么?让它完成吧。
  • @DanielA.White 抱歉,我根据您的评论更改了代码并解决了问题。

标签: c# winforms


【解决方案1】:

不要在关闭事件中再次调用 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();
        }
    }
}    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多