2013-07-03 33 views
0

我有一个超过10个文本框和1个按钮的表单,我想禁用该按钮的实时验证,直到所有文本框填充10或13长度的数值,我的代码是到目前为止以下:禁用按钮,直到多个文本框得到验证

Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load 
    For Each userID As Control In Me.Controls.OfType(Of TextBox)() 
     AddHandler userID.TextChanged, AddressOf ValidateAllFields 
    Next userID 
End Sub 
Private Sub userID_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs) Handles Me.KeyPress 
    If e.KeyChar <> ChrW(Keys.Back) Then 
     If Char.IsNumber(e.KeyChar) Then 
     Else 
      e.Handled = True 
     End If 
    End If 
End Sub 
Private Function ValidateAllFields() 
    Dim Validation As Boolean = True 
    For Each userID As Control In Me.Controls.OfType(Of TextBox)() 
     Dim e As New System.ComponentModel.CancelEventArgs 
     e.Cancel = False 
     Call userID_Validating(userID, e) 
     If e.Cancel = True Then Validation = False 
    Next userID 
    buttonSave.Enabled = Not Me.Controls.OfType(Of TextBox).Any(Function(userID) userID.Text.Length <> 10 AndAlso userID.Text.Length <> 13) 
    Return Validation 
End Function 
Private Sub userID_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles _ 
    user00.Validating, _ 
    user01.Validating, _ 
    user02.Validating, _ 
    user03.Validating, _ 
    user04.Validating, _ 
    user05.Validating, _ 
    user06.Validating, _ 
    user07.Validating, _ 
    user07.Validating, _ 
    user08.Validating, _ 
    user09.Validating, _ 
    user10.Validating, _ 
    user11.Validating 
    If Not IsNumeric(sender.Text) OrElse (sender.Text.Length <> 10) AndAlso (sender.Text.Length <> 13) Then 
     ErrorProvider1.SetError(sender, "") 
     ErrorProvider2.SetError(sender, "Please enter a valid User ID.") 
     e.Cancel = True 
    Else 
     ErrorProvider1.SetError(sender, "Valid User ID.") 
     ErrorProvider2.SetError(sender, "") 
    End If 
End Sub 

感谢你的帮助,它的工作原理是我想要的,但你可以帮助我提高/干净呢?我仍在研究vb,我愿意接受任何建议。提前致谢!

+0

什么样的错误是有效的用户ID? –

+0

如果在此代码中输入正确,ErrorProvider1应该为每个文本框添加一个绿色勾号图标。 – ml87

+0

你是说10个文本框中的每一个都必须包含一个长度为10-13个字符的数字? – dbasnett

回答

0

这里有执行你想要的操作的代码:

Dim done1, done2, done3 As Boolean 
Dim targetLength1 As Integer = 10 
Dim targetLength2 As Integer = 13 
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged 
    Try 
     If (IsNumeric(TextBox1.Text)) Then 
      If (TextBox1.Text.Length = targetLength1 Or TextBox1.Text.Length = targetLength2) Then 
       done1 = True 
      End If 
     End If 
     If (done1 And done2 And done3) Then 
      Button1.Enabled = True 
     End If 
    Catch ex As Exception 

    End Try 
End Sub 

Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged 
    Try 
     If (IsNumeric(TextBox2.Text)) Then 
      If (TextBox2.Text.Length = targetLength1 Or TextBox2.Text.Length = targetLength2) Then 
       done2 = True 
      End If 
     End If 
     If (done1 And done2 And done3) Then 
      Button1.Enabled = True 
     End If 
    Catch ex As Exception 

    End Try 
End Sub 

Private Sub TextBox3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox3.TextChanged 
    Try 
     If (IsNumeric(TextBox3.Text)) Then 
      If (TextBox3.Text.Length = targetLength1 Or TextBox3.Text.Length = targetLength2) Then 
       done3 = True 
      End If 
     End If 
     If (done1 And done2 And done3) Then 
      Button1.Enabled = True 
     End If 
    Catch ex As Exception 

    End Try 
End Sub 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Button1.Enabled = False 
End Sub 

它占只是3个文本框(TextBox1TextBox2TextBox3)和1个按钮(Button1),但你可以将想法扩展到尽可能多的文本框,如你所愿。它甚至依赖每个文本框的TextChanged。当条件满足时(给定的文本框的长度为10或13),相应的标志被设置为true(例如,对于TextBox1 ...为done1)。当所有标志都为真(所有文本框都包含预期信息)时,该按钮将被禁用。

+0

谢谢对于您的解决方案,非常适合禁用/启用按钮,但我想创建一个通用的textchange事件来检查表单中的所有文本框,并在输入满足要求时用errorprovider标记给用户。 – ml87

+0

每个文本框都有自己的处理程序/事件方法,你可以自动化处理,但最后你必须考虑与文本框一样多的方法 – varocarbas

+0

我想创建一个计数器,根据每次验证添加/减少1,并最终如果计数器等于文本框的数量,则启用该按钮,是否有可能? – ml87

0

我觉得会更好地使用TextChanged事件..

Private Sub TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged, TextBox2.TextChanged, ....., TextBox10.TextChanged 

    Chk4ButtonEnabled() 

End Sub 

Sub Chk4ButtonEnabled() 
Dim s as String 

    For Each userID As Control In Me.Controls 
     If userID.GetType Is GetType(TextBox) Then 
     s = userID.Text 
     If Not s.Length = 10 OR Not s.Length = 13 Then 
      ErrorProvider1.SetError(userID, "") 
      buttonSave.Enabled = False 
     Else 
      ErrorProvider1.SetError(userID, "Valid User ID.") 
      buttonSave.Enabled = True 
     End If 
     End If 
    Next  

End Sub 
相关问题