内置消息框对话框关闭自定义窗体.显示对话框()
本文关键字:对话框 显示 窗体 自定义 消息 内置 | 更新日期: 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.
}