内置MessageBox对话框关闭自定义Form.ShowDialog()

时间:2015-06-18 12:58:11

标签: c# winforms

好的问题如下:

我按如下方式调出自定义表单:

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

该对话框工作正常,因为no和yes按钮的行为符合预期。我的问题是,无论点击哪个按钮,代码都会跳回 // ** SOMEOTHERCODE 。所以实际上,_newForm刚刚关闭。

我显然不希望这种情况发生,因为我没有在另一种形式上完成,如果" No"单击按钮。

任何帮助?

编辑:

道歉 - 为了清楚起见。上面提到的网格在_newForm上。然后从_newForm调用该对话框。

这意外关闭。

3 个答案:

答案 0 :(得分:1)

不要使用表单的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();
    }
}

答案 1 :(得分:0)

代码类型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**

答案 2 :(得分:0)

解决此问题的方法是为表单的FormClosing事件添加处理程序,以便在那里取消它。

[编辑]

经过一些实验,通过检查FormClosingEventArgs.CloseReason似乎可以检测到这个错误。这通常是" UserClosing"在正常关闭时(甚至以编程方式调用this.Close()),但有了这个错误,它被设置为"无",我认为值是某种默认值,通常不应该是使用

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.
}