VB.NET验证表单以检查是否存在空字段或错误

VB.NET验证表单以检查是否存在空字段或错误,vb.net,validation,error-handling,Vb.net,Validation,Error Handling,到目前为止,我已经编写了代码,在用户填写Groupbox中的所有必填字段(文本框和组合框)之前,保存和更新按钮保持禁用状态,但我也希望保存和更新按钮保持禁用状态,直到用户解决了表单中的所有可用错误,例如Book_名称不应超过50个字符 如果有人能在这方面帮助我,我将不胜感激 下面是我尝试执行上述操作的代码,但不知何故它不起作用: Private Sub ValidateInputs(ByVal Sender As Object, ByVal e As EventArgs) Dim ctr

到目前为止,我已经编写了代码,在用户填写Groupbox中的所有必填字段(文本框和组合框)之前,保存和更新按钮保持禁用状态,但我也希望保存和更新按钮保持禁用状态,直到用户解决了表单中的所有可用错误,例如Book_名称不应超过50个字符

如果有人能在这方面帮助我,我将不胜感激

下面是我尝试执行上述操作的代码,但不知何故它不起作用:

Private Sub ValidateInputs(ByVal Sender As Object, ByVal e As EventArgs)
    Dim ctrl As Control
    Dim strErrorList As String
    strErrorList = ""
    For Each ctrl In Me.Controls
        If Len(ErrorProvider1.GetError(ctrl)) > 0 Then
            strErrorList += ErrorProvider1.GetError(ctrl) & ChrW(10) &
            ChrW(13)
        End If
    Next

    If Len(strErrorList) = 0 Then
        ' Process stuff if no errors
        btnsave.Enabled = Not GroupBox1.Controls.OfType(Of TextBox).Any(Function(t) t.Text = String.Empty) And _
       Not (cboStaff_id.Text = String.Empty OrElse cboPub_id.Text = String.Empty OrElse cboSub_Code.Text = String.Empty _
            OrElse DateTimePicker1.Text = " ")

        btnSaveUpdate.Enabled = Not GroupBox1.Controls.OfType(Of ComboBox).Any(Function(cbo) cbo.Text = String.Empty) And _
            Not (txtbook_name.Text = String.Empty OrElse txtauthor.Text = String.Empty OrElse txtprice.Text = String.Empty _
                 OrElse txtrack_no.Text = String.Empty OrElse TxtNo_of_Books.Text = String.Empty OrElse txtvol_no.Text = String.Empty OrElse DateTimePicker1.Text = " ")
        btndelete.Enabled = Not (cboISBN.Text = String.Empty)
    Else
        btnsave.Enabled = False
        btnSaveUpdate.Enabled = False
        MessageBox.Show(strErrorList, "List Of Errors")
    End If
End Sub

使用错误提供程序或创建您自己的错误提供程序来执行您和ISBN文本框所需的任务,例如,输入MaxLength=13,它将在没有任何错误提供程序或验证程序的情况下执行任务,对于电子邮件的电话号码,使用屏蔽文本框,或者,如果您只想接受文本框中的数字,请处理文本框的文本更改事件

因为我4天前问了这个问题,但没有人提供解决问题的答案,所以我研究并重新检查了我的代码,找到了解决问题的方法

因此,我将解释每一点,以澄清我所做的

'Below disables numeric entry; only characters and spaces allowed with the help of ASCII values
Private Sub txtbook_name_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtbook_name.KeyPress
    If Not (Asc(e.KeyChar) = 8) Then
        If Not ((Asc(e.KeyChar) >= 97 And Asc(e.KeyChar) <= 122) _  Or (Asc(e.KeyChar) >= 65 _
                                                                    And Asc(e.KeyChar) <= 90) _
                                                               Or (Asc(e.KeyChar) = 32)) Then
            e.KeyChar = ChrW(0)
            e.Handled = True
        End If
    End If
End Sub
'Bellow function return only true if input matches Regex pattern in other cases false
 Private Function ValidBook_name(ByVal book_name As String, ByRef errorMessage As String) As Boolean
    Dim regex As New System.Text.RegularExpressions.Regex("^[a-zA-Z ]{1,50}$")
    ' Confirm there is text in the control.
    If txtbook_name.Text.Length = 0 Then
        errorMessage = "Book Name is required"
        Return False
    End If
    If txtbook_name.Text.Length > 50 Then
        errorMessage = "Book Name can not be more than 50"
        Return False
    End If
    'Confirm that book name is in character not number
    If (regex.IsMatch(Trim(txtbook_name.Text))) Then
        errorMessage = ""
        Return True
    End If
    errorMessage = "A valid Book Name is required" + ControlChars.Cr
    Return False
End Function
'Check whether input entered is valid or not; if not return cursor to control 
 Private Sub txtbook_name_Validating(ByVal sender As Object, _
ByVal e As System.ComponentModel.CancelEventArgs) Handles txtbook_name.Validating
    Dim errorMsg As String
    Try
            If Not ValidBook_name(txtbook_name.Text, errorMsg) Then
                ' Cancel the event and select the text to be corrected by the user.
                e.Cancel = True
                txtbook_name.Select(0, txtbook_name.Text.Length)
                ' Set the ErrorProvider error with the text to display. 
                Me.ErrorProvider1.SetError(txtbook_name, errorMsg)
            End If
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub


Private Sub txtbook_name_Validated(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles txtbook_name.Validated
    ' If all conditions have been met, clear the error provider of errors.
    Try
        ErrorProvider1.SetError(txtbook_name, "")
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
End Sub
下面的
”禁用数字输入;在ASCII值的帮助下,只允许使用字符和空格
私有子txtbook_name_KeyPress(发送方作为对象,e作为KeyPressEventArgs)处理txtbook_name.KeyPress
如果不是(Asc(e.KeyChar)=8),则
如果不是((Asc(e.KeyChar)>=97和Asc(e.KeyChar)=65_
然后是Asc(e.KeyChar)50
errorMessage=“书籍名称不能超过50”
返回错误
如果结束
'确认图书名称是字符而不是数字
如果(regex.IsMatch(Trim(txtbook_name.Text)),那么
errorMessage=“”
返回真值
如果结束
errorMessage=“需要有效的图书名称”+ControlChars.Cr
返回错误
端函数
'检查输入的输入是否有效;如果无效,则将光标返回控件
私有子txtbook\u name\u验证(ByVal发送方作为对象_
ByVal e作为System.ComponentModel.CancelEventArgs)处理txtbook_name
Dim errorMsg作为字符串
尝试
如果未验证Book_name(txtbook_name.Text,errorMsg),则
'取消事件并选择要由用户更正的文本。
e、 取消=真
txtbook_name.Select(0,txtbook_name.Text.Length)
'使用要显示的文本设置ErrorProvider错误。
Me.ErrorProvider1.SetError(txtbook\u名称,errorMsg)
如果结束
特例
MessageBox.Show(例如Message)
结束尝试
端接头
私有子txtbook\u name\u已验证(ByVal发送方作为对象_
ByVal e As System.EventArgs)处理txtbook_name.Validated
'如果满足所有条件,请清除错误提供程序中的错误。
尝试
ErrorProvider1.SetError(txtbook_name,“”)
特例
MessageBox.Show(例如Message)
结束尝试
端接头

希望这有帮助…

为什么你不能为
TBISBN.Text.Length<13
添加一个测试?@puropoix我可以控制所有字段textchanged event,如果值与所需的正则表达式模式不匹配,errorprovider将出现。我现在想要的是保存/更新按钮保持禁用状态,直到所有错误得到纠正!我明白了问题。那么@Proputinix您能提供答案吗?我可以控制所有字段textchanged event,如果值与所需的正则表达式模式不匹配,则会出现errorprovider。我现在想要的是,保存/更新按钮保持禁用状态,直到所有错误得到纠正!在所有错误被纠正后,在表单中创建一个不可见的文本框put y已更正且无更多错误,如果有错误,请在新文本框的文本更改事件中输入y,如果有,请写入“如果其他”以启用或禁用保存/更新。不明白您的意思吗?