2011-08-18 54 views
3

我在我的WinForms应用程序中创建一个对话框。这有很多文本框和确定/取消按钮。当用户点击确定时,如果所有条目都有效,我只希望关闭对话框。我可以看到如何分别为每个控件的“验证”事件执行此操作。没事儿。但是,当控制失去焦点时,这些似乎只会发射。然而,在我的对话空文本框也是无效的输入,这意味着用户可能永远都集中在控制。我希望只需单击确定即可验证所有控件。验证数据在一个WinForm

我不能工作了如何做到这一点,虽然。重写OK按钮的onclick似乎并不具有从封闭停止窗口的选项。 Form IsClosing事件通过设置Cancel = true来完成。但是这似乎无法区分OK或Cancel按钮是否被点击。显然,如果点击取消按钮,我不关心验证和希望允许的形式关闭不管。

什么是这样做的最佳方法]

更新: 我已经有了的CausesValidation设置为我的两个形式和ok键,但我的验证事件的真实不被解雇当我点击确定按钮。我提到这是因为它被建议作为下面的解决方案。

+0

为什么能”你打电话给你的验证(我建议看看数据绑定和验证你的绑定对象的方法)onclick ok按钮,然后不关闭验证的形式失败?单击确定后,表单不应该神奇地关闭。 –

回答

5

请选择表格>属性CausesValidation设置为true

选择OK按钮,并重新设置属性CausesValidationtrue

,然后它会采取一切验证的照顾。

要点: 1)您必须在所有的验证事件处理

2)如果你的按钮都在面板则必须设置面板(或任何父控件的)CausesValidation属性true

e.Cancel=true编辑:

3)刚刚失去重心前验证火灾。当按下Enter键将 导致默认按钮点击,它不会将焦点移动到 按钮,因此没有验证事件将被解雇,如果你已经设置的AcceptButton形式财产OK键

+0

我将CausesValidation设置为true,并且在单击确定时它仍然不会调用我的验证事件。不幸的是,这是我问这个问题的全部原因。 – Jonnster

+0

@Jonnster:你是否将Causes的所有父控件的CausesValidation属性设置为true? – Marshal

+0

@Jonnster:另请参阅回答中的编辑部分 – Marshal

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(); 
     } 
    } 
1

首先确保在任何文本框出现验证错误时取消验证。例如:

private void nameTextBox_Validating(object sender, CancelEventArgs e) { 
    if (nameTextBox.Text.Length == 0) 
    { 
     e.Cancel = true; 
     return; 
    } 
} 

下面的代码现在添加到OK按钮动作的开头:

if (!ValidateChildren()) 
    return; 

这将触发对窗体上的所有控件的验证事件,