65.9K
CodeProject 正在变化。 阅读更多。
Home

Windows Forms 验证与 ErrorProvider 控件快速实现(一次性验证整个表单)

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.67/5 (2投票s)

2008年4月26日

CPOL

2分钟阅读

viewsIcon

52226

Windows Forms 验证与 ErrorProvider 控件快速实现(一次性验证整个表单)

引言

你是否对 error-provider 感到沮丧?你只想有一个方法,可以在提交之前一次性验证整个表单。这就是它…

背景

我有一个通用的方法,可能与大家的方法类似。我有一个网格,然后打开一个表单来添加/编辑对象。你需要验证信息是否已输入,以及是否正确输入。

me.validate() 的问题在于它只验证最后一个获得焦点的控件。ValidateChildren 似乎是一个可行的解决方案,但它也没有为我验证所有内容。

所以我只剩下 .Net 提供的功能,并创建了一个简单的类来利用它想要的工作方式。如果它想在每个控件失去焦点后进行验证,那么我将循环遍历所有控件并赋予它焦点,然后调用 validate。这工作得很好,直到我开始在表单中包含选项卡控件,然后我发现它只能正确验证当前选定的选项卡页面。我不得不回去并为这种情况添加一个特殊条件。我使用 devexpresses 控件集,所以我的特殊情况是选项卡控件,但再添加几行代码,你可以使其处理任何特殊情况,例如 Windows 选项卡控件、可能的分裂容器等。

使用代码

在每个表单上放置一个 ErrorProvider。我喜欢在每个表单上将我的命名为 ErrorProvider,这样我就不必在每个代码中进行更改。将 autovalidate 设置为“启用允许焦点更改”,以获得最佳用户体验。

在 FormClosing 事件中放置一个 e.cancel = false,这样即使表单未验证,表单顶部的“取消”按钮和“x”按钮也能正常工作。

确保你的保存按钮具有 causesvalidation = true,以及你想要验证的任何控件。我相信这是默认设置。确保其他按钮,尤其是取消按钮具有 causesvalidation=false,这样它们就不会进行验证。

然后,一旦你养成了在每个表单上执行此操作的习惯,你就可以使用下面的模板和一些复制粘贴来为要验证的每个控件放置验证器,然后当你点击保存按钮时……你只需要调用“If Validation.FormIsValid Then…” 你的整个表单将通过一个语句进行验证。

就是这么简单……我更喜欢 Asp.Net 的方法,但有了这个类,你可以接受它,甚至可能爱上它……

// Here is some code on the form that will help you out...
Private Sub frmCompany_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing

    Try

      e.Cancel = False

    Catch ex As Exception

      Errors.HandleError(ex)

    End Try

  End Sub

Private Sub txtName_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtName.Validating

    Try

      If Not txtName.Text.Length > 0 Then
        ErrorProvider.SetError(txtName, "You must include a name.")
        e.Cancel = True
      Else
        ErrorProvider.SetError(txtName, String.Empty)
      End If

    Catch ex As Exception

      Errors.HandleError(ex)

    End Try

  End Sub 
 
End Class  
 // Here is the code for the class
Imports DevExpress.XtraTab
Imports System.Collections.Generic
Imports System.Windows.Forms
Imports System.Windows.Forms.Form

Public Class Validation

#Region "Public Shared Methods"

  Public Shared Function FormIsValid(ByRef objForm As Form) As Boolean

    Dim Valid As Boolean = True
    Validate(objForm, objForm.Controls, Valid)

    objForm.Focus()
    If Not objForm.Validate Then Valid = False

    Return Valid
    
  End Function

  Public Shared Function FormIsValid(ByRef objform As Form, ByRef TopLevelControl As Control) As Boolean

    Dim Valid As Boolean = True
    Validate(objform, TopLevelControl.Controls, Valid)

    objform.Focus()
    If Not objform.Validate Then Valid = False

    Return Valid
   
  End Function

  Private Shared Sub Validate(ByRef objForm As Form, ByRef objControls As System.Windows.Forms.Control.ControlCollection, ByRef Valid As Boolean)

    For Each objControl As Control In objControls

      If Not TypeOf objControl Is RadioButton Then

        objControl.Focus()
        If Not objForm.Validate() Then Valid = False

        If TypeOf objControl Is XtraTabControl Then

          Dim TabControl As XtraTabControl = objControl
          Dim Index As Integer = TabControl.SelectedTabPageIndex

          For Each objTab As XtraTabPage In TabControl.TabPages
            TabControl.SelectedTabPage = objTab
            Validate(objForm, objTab.Controls, Valid)
          Next

          TabControl.SelectedTabPageIndex = Index

        ElseIf objControl.HasChildren Then

          Validate(objForm, objControl.Controls, Valid)

        End If

      End If

    Next

  End Sub

#End Region

End Class 
© . All rights reserved.