我有一个表单,在其他控件中,有一个 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 。
先感谢您 。
杰克格里芬