当表单是模态时,如何在不退出表单的情况下退出函数?

时间:2012-04-28 09:29:12

标签: c# winforms

我有一个表单,在其他控件中,有一个TextBox字段,可以由用户选择填写 还有一个 btnSubmit Button ,可执行必要的操作并关闭表单 在其代码中,我检查是否存在注释,如果不存在,请在退出前询问用户是否要填写注释。
我使用 bool AskToFillCommentIfNeeded()函数显示一个MessageBox,要求用户在退出之前选择填写注释,如果还没有这样做的话。
如果用户回答是,则返回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 先感谢您 。

杰克格里芬

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

注意:我现在可以发布此内容,但在论坛上发布新内容 在回答我自己的问题之前,我必须等待8个小时 不过,我觉得一篇文章比留下评论更好 在这种情况下的每个答案 (我的意思是我要立刻联系到你:-))。

感谢您的答案快于答案! 他们非常有启发性 @Hans Passant:这正是我追求的解决方案 @mrtofigh:更改按钮.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()是一个bool函数,显示MessageBox询问用户是否要在不提交的情况下退出并在Yes上返回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       
}

我测试过它,效果很好。
再次感谢你。
千斤顶