我在Windows窗体上遇到以下方案的问题:
我创建了一个带有两个按钮的窗体,每个按钮分别分配了行为DialogResult OK和DialogResult Cancel。 但基于某些条件,我需要停止执行OK按钮。问题是,如果我这样做了一次回报:
private void btnOk_Click(object sender, EventArgs e)
{
foreach(Control control in tblTable.Controls)
{
if (control.GetType() == typeof(TextBox))
{
if (control.Text.Trim() == "")
{
control.Focus(); return;
}
}
else
{
}
}
}
对话框结果会一直向父表单返回OK答案。
我需要停止执行事件,并且在用户更正表单上的信息之前不会返回任何答案。换句话说,应该将用户带回表单以更正任何丢失或错误的数据。
答案 0 :(得分:7)
正如Hans Passant在评论中提到的那样,只需将DialogResult设置为None!
像这样:
private void btnOk_Click(object sender, EventArgs e)
{
if(ValidationFailed())
{
this.DialogResult = DialogResult.None;
return;
}
//...
}
答案 1 :(得分:4)
我个人不会在这个场景中使用DialogResult
个按钮。当只有不需要任何其他逻辑的不同选项(即制作自定义MessageBox)时,我只倾向于设置DialogResult
。
我要做的就是自己发送DialogResult
成功:
private void btnOk_Click(object sender, EventArgs e)
{
if (allIsOK())
{
this.DialogResult = DialogResult.OK;
}
}
答案 2 :(得分:1)
考虑使用表单的Closing
事件,并使用事件args的Cancel
属性来取消表单关闭。
这是一个讨论这个想法的网页;这是VB,但你会明白这个想法: