3

我有一个表单,在其他控件中,有一个 TextBox 字段,可以选择由 user 填写。
还有一个btnSubmit 按钮,用于执行所需的操作并关闭表单。
在其代码中,我检查是否存在评论,如果没有,则在退出之前询问用户是否要填写评论。
我使用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 。
先感谢您 。

杰克格里芬

4

3 回答 3

3

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

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

     // ... save data and exit form ...
}
于 2012-04-28T09:42:06.797 回答
1

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

于 2012-04-28T09:44:12.377 回答
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()是一个布尔函数,显示一个 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       
}

我测试了它,它工作得很好。
再次感谢你 。
杰克

于 2012-04-28T17:30:59.510 回答