我有一个表单,其中包含一些控件,其中一个文本框可以由用户选择性地填写。
还有一个btnSubmit按钮执行所需的操作并关闭表单。
在代码中,我检查是否存在评论,如果没有,则询问用户是否要在退出之前填写评论。
我使用一个名为bool AskToFillCommentIfNeeded()的函数,它显示一个消息框,询问用户在退出之前是否选择填写评论(如果尚未完成)。
如果用户回答“是”,则返回true,否则返回false。
如果用户点击“是”,则必须退出提交函数而不关闭表单,以便用户可以输入评论,然后再次按提交按钮。
我在非模态表单中使用此代码,其按预期工作。
但是当我尝试在对话框中使用它,并将btnSubmit的DialogResult属性设置为OK时,它不按预期工作:
它不仅退出事件接收器,还关闭窗体而没有保存数据。
我想出了一个(笨拙的)解决方法,使用布尔标志如下:
因此,如果执行了return语句,我会拦截_FormClosing事件,并在标志设置为true时取消它:
还有一个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。
提前感谢您。
杰克·格里芬