我按如下方式调出自定义表单:
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调用该对话框。
这意外关闭。
答案 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.
}