我在WinForms应用程序中创建了一个对话框。这有许多文本框和确定/取消按钮。当用户单击“确定”时,如果所有条目都有效,我只希望关闭对话框。我可以分别使用每个控件的“Validating”事件来了解如何执行此操作。那样就好。但是当控件失去焦点时,这些似乎只会触发。但是,对话框中的空文本框也是无效输入,这意味着用户可能永远不会专注于该控件。我更愿意在单击OK时验证所有控件。
我无法解决如何做到这一点。覆盖OK按钮的onclick似乎没有停止关闭窗口的选项。 Form IsClosing事件通过设置Cancel = true来完成。但这似乎无法区分是否单击了“确定”或“取消”按钮。显然,如果单击取消按钮,我不关心验证,并希望允许表单关闭。
这样做的最佳方法是什么?]
更新: 我已经在我的表单和确定按钮上将CausesValidation设置为true,但是当我单击确定按钮时,我的验证事件不会被触发。我提到这个,因为它被建议作为下面的解决方案。
答案 0 :(得分:5)
请选择表格>将属性CausesValidation
设置为true
选择确定按钮,然后再将属性CausesValidation
设置为true
然后它会处理所有验证。
重点:
1)您必须在所有验证事件处理程序中提及e.Cancel=true
2)如果您的按钮位于面板中,则必须将面板(或任何父控件)CausesValidation
属性设置为true
修改强>
3)在失去焦点之前验证火灾。按Enter键的同时 导致默认按钮单击,它不会将焦点移动到那个 按钮,因此如果您已将表单AcceptButton属性设置为确定按钮
,则不会触发验证事件答案 1 :(得分:2)
首先确保在任何文本框出现验证错误时取消验证。例如:
private void nameTextBox_Validating(object sender, CancelEventArgs e) {
if (nameTextBox.Text.Length == 0)
{
e.Cancel = true;
return;
}
}
现在将以下代码添加到ok按钮操作的开头:
if (!ValidateChildren())
return;
这将触发表单上所有控件的验证事件,
答案 2 :(得分:1)
您也可以使用这个简单的代码。只是引入一个名为hasError的简单布尔变量就可以完成这项工作。
public partial class Form1 : Form
{
private bool hasError;
public Form1()
{
InitializeComponent();
}
private void OkBtn_Click(object sender, EventArgs e)
{
errorProvider1.Clear(); hasError=false;
if (ValidateTxt.Text.Length == 0)
{
errorProvider1.SetError(ValidateTxt, "must have a value");
hasError=true;
}
if (!hasError)
{
//Do what you want to do and close your application
Close();
}
}
private void CancelBtn_Click(object sender, EventArgs e)
{
Close();
}
}