2012-04-28 26 views
3

我有一个窗体,在其他控件中,有一个TextBox字段,可以由用户选择填充。
还有一个btn提交按钮执行所需的操作并关闭窗体。
在其代码中,我检查是否存在评论,如果不是这样,请询问用户是否在退出之前填写它。
我使用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。
预先感谢您。

杰克·格里芬

+0

感谢您的及时答复。 – 2012-04-28 11:15:16

+0

糟糕!错误的评论! – 2012-04-28 12:10:45

+0

您可以删除评论。而且你不必感谢每一张海报。 – 2012-04-28 12:36:42

回答

3

只需设置窗体的DialogResult属性返回到无以防止关闭对话框:

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

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

感谢您的及时答复。 – 2012-04-28 12:11:02

+0

这样一个简单的答案,但我完全错过了!谢谢。 :) – 2012-08-07 15:08:06

1

设置button.DialogResult = None并在button.Click事件手动分配form.DialogResult财产。

+0

感谢您的及时答复。 – 2012-04-28 12:10:51

+0

这工作,但不是正确的解决方案。确定按钮不再看起来像对话框的默认按钮,请注意丢失的重边框。 – 2012-04-28 12:57:05

0

注意:我现在要发布这个,但在论坛上新出现
我必须等待8个小时才能回答我自己的问题。
尽管如此,我觉得一个帖子比在这种情况下对每个回答留下评论 要好。
(我的意思是,我的感谢是立即联系你:-))。

感谢您提供比光线更快的答案!
他们非常有启发性。
@Hans Passant:这正是我之后的解决方案。
@mrtofigh:改变按钮。对话结果不成功,它必须是形式。DialogResult。
@亨克霍尔特曼:你对标题栏中的关闭按钮是正确的。
如果用户点击它,应用程序将假定用户不打算 提交任何东西。
为了保证这一点,我将添加以下代码:

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  
} 

我测试了它和它的作品就好了。
再次感谢您。
杰克