我在一个组框中有多个文本框,并且可以成功地遍历它们。但是,checkNumbers子节点无法识别空白/空条目以及非数字字符。如果满足所有条件,则correctValidation布尔值应返回true(无空格/空值,且必须是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
答案 0 :(得分:1)
我会使用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
代替And
和OrElse
而不是Or
,因为这些运算符是短路布尔运算符。这可以更有效 - 更重要的是 - 可以防止错误。考虑一下:
Dim text = ""
If txt IsNot Nothing And txt.Text.Length <> 0 Then text = txt.Text
如果txt
没有任何内容,则会失败,因为第二个条件已经过评估,即使第一个条件已经评估为false
,导致NullReferenceException
位于txt.Text
。
答案 1 :(得分:0)
如果您只想要一个数值,为什么不尝试使用NumericUpDown。您还可以设置最小值和最大值属性,或使用
NumericUpDown1.Maximum = 20
所以,不需要做checkNumbers。
或者你有什么理由要使用文本框吗?