您好 我有一个表单,其中包含几个文本框和两个按钮取消和确定。这些按钮被指定为接受和取消表单中的按钮属性。问题是我必须验证在所有文本框中输入的文本。
如果用户单击“确定”按钮(即acceptButton),我想这样做。所以我编写了一个可以验证的函数,如果用户单击“确定”按钮,我将触发此函数。问题是即使验证函数返回false,我也无法阻止表单关闭。这是因为我将acceptbutto属性分配给了我的Ok按钮。如果验证失败而没有删除acceptbutton属性,有没有办法阻止表单关闭?
答案 0 :(得分:30)
这是我们使用的工作解决方案(而且它是根据其他答案编写的)。
您只需将DialogResult
设置为None
即可阻止表单关闭。
//form init, auto-generated code (this is the case described)
private void InitializeComponent()
{
//....
this.AcceptButton = btnOk;
this.btnOk.DialogResult = DialogResult.OK;
//....
}
//event handlers
private void btnOK_Click(object sender, EventArgs e)
{
if (!Validate())
this.DialogResult = DialogResult.None;
}
private void Form_FormClosing(object sender, FormClosingEventArgs e)
{
if (this.DialogResult == DialogResult.None)
e.Cancel = true;
}
答案 1 :(得分:6)
一种方法是在OnFormClosing事件中应用验证,并根据验证结果取消操作。
<强> - 编辑 - 强>
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (this.DialogResult == DialogResult.OK)
{
if (!IsValid())
{
Info("Invalid data");
e.Cancel = true;
}
else
{
Info("Valid data found, closing dialog");
}
}
else if (this.DialogResult == DialogResult.Cancel)
{
Info("Just cancelling!");
}
}
您可以在取消/确定事件上致电this.Close();
。
或者,在“确定”按钮实施中,您可以更改按钮的DialogResult
并将其设置为None
;
acceptButton.DialogResult = DialogResult.None;
答案 2 :(得分:6)
在Ok按钮中单击处理程序,在验证失败时将DialogResult更改为DialogResult.None
答案 3 :(得分:1)
请勿在表单中设置AcceptButton
属性,并从按钮中删除DialogResult
属性(将其设置为DialogResult.None
)。
您可以在验证代码中设置表单的DialogResult属性。
if (allFieldsValidated) {
DialogResult = DialogResult.OK;
}
答案 4 :(得分:0)
不要在Designer或其他地方设置Button.DialogResult (不要与Form.DialogResult混淆)。在Button的单击处理程序中执行验证,如果成功将Form.DialogResult设置为DialogResult.OK并关闭表单。
private void OkBtn_Click(object sender, EventArgs e)
{
if (isValid())
{
this.DialogResult = DialogResult.OK;
this.Close();
}
}