使用多个检查验证多个文本框

Validating multiple textboxes with multiple checks

我在一个组框中有多个文本框,并且可以成功循环所有这些文本框。但是 checkNumbers 子程序无法识别 blank/null 条目以及非数字字符。如果满足所有条件,则 correctValidation 布尔值应该 return 为真(否 blanks/nulls,并且必须是 1-20 之间的数字)。任何有关如何解决此问题的想法都将不胜感激。

Private Sub checkNumbers()

Try
            For Each txt As TextBox In Me.gbTechnical.Controls.OfType(Of TextBox)()
                If txt.Text <> "" And IsNumeric(txt.Text) And (Integer.Parse(txt.Text) >= 1 And Integer.Parse(txt.Text) <= 20) Then
                    correctValidation = True
                Else
                    correctValidation = False
                    MsgBox("Please ensure all numbers are between 1 and 20")
                    Exit Sub
                End If
            Next

Catch ex As Exception
            MessageBox.Show("General: Please ensure all numbers are between 1 and 20")
        End Try

    End Sub

我会使用 Integer.TryParse 然后 >= 1 AndAlso <= 20。您可以使用此 LINQ 查询:

Dim number As Int32
Dim invalidTextBoxes = 
    From txt In gbTechnical.Controls.OfType(Of TextBox)()
    Where Not Integer.TryParse(txt.Text, number) OrElse number < 1 OrElse number > 20
Dim correctValidation = Not invalidTextBoxes.Any()

请注意,您应该几乎总是使用 AndAlso 而不是 AndOrElse 而不是 Or,因为这些运算符是短路布尔运算符。这可以更有效,并且 - 更重要的是 - 可以防止错误。考虑一下:

Dim text = ""
If txt IsNot Nothing And txt.Text.Length <> 0 Then text = txt.Text

如果 txt 为空,则此操作失败,因为即使第一个条件已被评估为 false,也会评估第二个条件,这会在 txt.Text 处导致 NullReferenceException

如果您只想要一个数字值,为什么不尝试使用 NumericUpDown。您还可以在 属性 中设置最小值和最大值或使用

NumericUpDown1.Maximum = 20

因此,不需要执行 checkNumbers。

或者你有什么理由必须使用文本框??