2015-01-21 4 views
0

У меня есть несколько текстовых полей в групповом ящике, и вы можете успешно их обойти. Однако подпапка checkNumbers не распознает пустые/нулевые записи, а также нечисловые символы. Правильный вердикт boolean должен возвращать 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.

+0

Спасибо, что, похоже, сработает - заменил бы ваш правильный валидатор логическим на ваш действительный? – Nick

+0

@ Ник: да. Я мог бы переименовать его в 'correctValidation', если это поможет. ** Отредактируйте **. Обратите внимание, что мой подход также позволяет выводить, какие текстовые поля содержат неправильные номера или недопустимые форматы. Поэтому вам просто нужно использовать '' Invalid: "& String.Join (", ", invalidTextBoxes.Select (Function (txt) txt.Text)))'. –

+0

Хорошо, просто проверив, большое спасибо за советы. – Nick

0

Если вы хотите только числовое значение, почему бы вам не попробовать использовать NumericUpDown. Вы также можете установить минимальное и максимальное значение в свойстве или использовать

NumericUpDown1.Maximum = 20 

так, что не будет необходимости делать checkNumbers.

Или есть ли какие-либо причины, по которым вы должны использовать текстовое поле?