我有一个表单,在其他控件中,有一个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
先感谢您 。
答案 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
}
我测试过它,效果很好。
再次感谢你。
千斤顶