内置消息框对话框关闭自定义窗体.显示对话框()

本文关键字:对话框 显示 窗体 自定义 消息 内置 | 更新日期: 2023-09-27 17:57:08

好的问题如下:

我调用一个自定义表单,如下所示:

SomeCustomForm _newForm = new SomeCustomForm();
_newForm.ShowDialog();
//**SOME OTHER CODE**

现在假设我们有一些自定义事件(我的在DataGridView DoubleClick上):

private void dgvSomeGrid_DoubleClick(object sender, EventArgs e)
{
    string name = dgvSomeGrid.CurrentRow.Cells[5].Value.ToString();
    DialogResult = MessageBox.Show(name, "Select this Merkmal?", MessageBoxButtons.YesNo);
    if (DialogResult == DialogResult.Yes)
    {
        _someID = Convert.ToInt32(dgvMSomeGrid.CurrentRow.Cells[0].Value.ToString());
        this.Close();
    }
    else if (DialogResult == DialogResult.No)
    {
        return;
    }
}

对话框工作正常,因为"否"和"是"按钮按预期运行。我的问题是,无论单击哪个按钮,代码都会跳回到//**SOMEOTHERCODE。所以实际上,_newForm只是关闭了。

我显然不希望这种情况发生,因为如果单击"否"按钮,我还没有完成另一个表单。

有什么帮助吗?

编辑:

我很抱歉 - 为了清楚起见。上面提到的网格在_newForm上。对话框是从_newForm调用的。

这将意外关闭。

内置消息框对话框关闭自定义窗体.显示对话框()

不使用

表单DialogResult属性进行比较。仅在成功关闭时设置

private void dgvSomeGrid_DoubleClick(object sender, EventArgs e)
{
    string name = dgvSomeGrid.CurrentRow.Cells[5].Value.ToString();
    var result = MessageBox.Show(name, "Select this Merkmal?", MessageBoxButtons.YesNo);
    if (result == DialogResult.Yes)
    {
        _someID = Convert.ToInt32(dgvMSomeGrid.CurrentRow.Cells[0].Value.ToString());
        this.DialogResult = DialogResult.Yes;
        this.Close();
    }
}

代码类型static bool formCloseFlag = false;中的某个地方

让我们稍微缩短一下事件处理程序代码:

   private void dgvSomeGrid_DoubleClick(object sender, EventArgs e)
    {
        string name = dgvSomeGrid.CurrentRow.Cells[5].Value.ToString();
        DialogResult = MessageBox.Show(name, "Select this Merkmal?", MessageBoxButtons.YesNo);
        if (DialogResult == DialogResult.Yes)
        {
            _someID = Convert.ToInt32(dgvMSomeGrid.CurrentRow.Cells[0].Value.ToString());
            formCloseFlag = true;
        }
        return;
    }

然后像这样更改您的代码:

SomeCustomForm _newForm = new SomeCustomForm();
_newForm.ShowDialog();
//**SOME OTHER CODE**
if(formCloseFlag) { _newForm.Close(); formCloseFlag = false; }
//**SOME OTHER CODE**

解决此问题的方法是为窗体的 FormClosing 事件添加一个处理程序,以便您可以在那里取消它。

[编辑]

经过一些实验,似乎可以通过检查FormClosingEventArgs.CloseReason检测到该错误。这通常是正常关闭时的"UserClosesing"(即使是以编程方式调用this.Close()),但是对于此错误,它被设置为"None",我认为该值是通常永远不应该使用的某种默认值。

private void form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason == CloseReason.None)
    {
        e.Cancel = true;
        return;
    }
    // any other OnClose code you may wish to execute.
}