当窗体为模态窗体时,如何退出函数而不退出窗体?

3
我有一个表单,其中包含一些控件,其中一个文本框可以由用户选择性地填写。
还有一个btnSubmit按钮执行所需的操作并关闭表单。
在代码中,我检查是否存在评论,如果没有,则询问用户是否要在退出之前填写评论。
我使用一个名为bool AskToFillCommentIfNeeded()的函数,它显示一个消息框,询问用户在退出之前是否选择填写评论(如果尚未完成)。
如果用户回答“是”,则返回true,否则返回false。
如果用户点击“是”,则必须退出提交函数而不关闭表单,以便用户可以输入评论,然后再次按提交按钮。

[编辑]代码类似于:

private void btnSubmit_Click(object sender, EventArgs e)
{
     // ask user if he wants to fill the comment : if so, exit this function
     if (AskToFillCommentIfNeeded()) { return; };

     // ... save data and exit form ...
}

我在非模态表单中使用此代码,其按预期工作。
但是当我尝试在对话框中使用它,并将btnSubmit的DialogResult属性设置为OK时,它不按预期工作:
它不仅退出事件接收器,还关闭窗体而没有保存数据。
我想出了一个(笨拙的)解决方法,使用布尔标志如下:
private bool isBusy = false;
private void btnSubmit_Click(object sender, EventArgs e)
{
     // clumsy attempt to avoid form exit :
     isBusy = true;

     // ask user if he wants to fill the comment : if so, exit this function
     if (AskToFillCommentIfNeeded()) { return; };

     isBusy = false;

      // ... save data and exit form ...
}

因此,如果执行了return语句,我会拦截_FormClosing事件,并在标志设置为true时取消它:
private void FDialog_FormClosing(object sender, FormClosingEventArgs e)
{
     // abort closing if flag is set
     e.Cancel = isBusy;
}

这个方法可以用,但是不太令人满意。
有没有更好的方法来实现相同的行为?
我正在使用C# Express 2010。
提前感谢您。

杰克·格里芬


感谢您的及时回复。 - Jack Griffin
你可以删除评论。而且你不必感谢每个发帖人。 - H H
3个回答

3

只需将表单的 DialogResult 属性设置为 None,即可防止对话框关闭:

private void btnSubmit_Click(object sender, EventArgs e)
{
     if (AskToFillCommentIfNeeded()) {
         this.DialogResult = DialogResult.None; 
         return;
     }

     // ... save data and exit form ...
}

感谢您的及时回复。 - Jack Griffin
这样一个简单的答案,我竟然完全忽略了它!谢谢。 :) - VikingProgrammer

1

button.Click事件中手动设置button.DialogResult = None并分配form.DialogResult属性。


感谢您的迅速回答。 - Jack Griffin
这个可以运行,但不是正确的解决方案。确定按钮不再像对话框的默认按钮一样,注意缺少了粗边框。 - Hans Passant

0
注:我本来想立即发布这篇文章的,但因为我是论坛新手,所以必须等待8小时才能回答自己的问题。
不过,在这种情况下,我觉得发帖比仅仅留言更好。
(我的感谢要立即传达给您 :-) )。
非常感谢您的超光速回复!
它们非常有启示性。
@Hans Passant: 这正是我想要的解决方案。
@mrtofigh: 更改button.DialogResult不起作用,必须更改form.DialogResult。
@Henk Holterman: 关于标题栏中的关闭按钮,您是正确的。
但如果用户单击它,应用程序将假定用户不打算提交任何东西。
为确保这一点,我将添加此代码:
private void FDialog_FormClosing(object sender, FormClosingEventArgs e)
{
    // intercept form closing from Close box in title bar
    if (e.CloseReason == CloseReason.UserClosing)
        {
             e.Cancel = !ConfirmFormExit();
        }
}

ConfirmFormExit() 是一个布尔函数,显示一个消息框询问用户是否要在不提交的情况下退出,并在选择“是”时返回 true。

因此,代码将是:

private void btnSubmit_Click(object sender, EventArgs e)
{
    //  avoid form exit right now
    this.DialogResult = DialogResult.None;

    // ask user if he wants to fill the comment : if so, exit this function 
    if (AskToFillCommentIfNeeded()) { return; };

    // now is safe to return dialog result
    this.DialogResult = DialogResult.OK;

    // ... save data and exit form       
}

我测试过了,它完美地运行着。
再次感谢你。
杰克


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接