2016-11-13 4 views
0

Я нахожусь на начальном уровне визуального базового класса. Я пытаюсь проверить пользовательский ввод, чтобы узнать, является ли он численным с помощью функции IsNumeric boolean. В принципе, если ввод не является числовым, я хочу, чтобы он запустил сообщение, говорящее так, и если оно числовое, я хочу, чтобы он определял числовые значения в качестве переменных. Каждый раз, когда я ввожу нечисловое значение, я не получаю сообщение, вместо этого получаю исключение, когда он пытается преобразовать нечисловую строку в double, используя CDbl. Что я делаю не так?Мой условный оператор не работает

If txtInches.Text = "" Or txtFeet.Text = "" Then 'Checks to ensure height fields were not left blank 
     'If fields were blank, throws error message up, changes textbox backgroud color to red, focuses user on error and exits sub. 
     MessageBox.Show("You must enter a value for both feet and inches. Don't leave these fields blank, and try again.", "Height Error", MessageBoxButtons.OK) 
     txtFeet.BackColor = Color.Red 
     txtInches.BackColor = Color.Red 
     txtFeet.Focus() 
     Exit Sub 
    ElseIf txtAge.Text = "" Then 'Checks to see if age field was blank 
     'If age field was blank, throws error message up, changes textbox backgroud color to red, focuses user on error and exits sub. 
     MessageBox.Show("You must enter your age. Don't leave this field blank, and try again.", "Age Error", MessageBoxButtons.OK) 
     txtFeet.BackColor = Color.Red 
     txtInches.BackColor = Color.Red 
     txtFeet.Focus() 
     Exit Sub 
    ElseIf Not IsNumeric(dblFeet) Then 
     'If feet input is not numeric, throws error message up, changes textbox background color to red, focuses user on error and exits sub. 
     MessageBox.Show("Feet must be a numeric value. Please try again.", "Height Error", MessageBoxButtons.OK) 
     txtFeet.BackColor = Color.Red 
     txtFeet.Focus() 
     Exit Sub 
    ElseIf Not IsNumeric(dblInches) Then 'Checks to see if height input is numeric 
     'If inches input is not numeric, throws error message up, changes textbox background color to red, focuses user on error and exits sub. 
     MessageBox.Show("Inches must be a numeric value. Please try again.", "Height Error", MessageBoxButtons.OK) 
     txtInches.BackColor = Color.Red 
     txtInches.Focus() 
     Exit Sub 
    ElseIf Not IsNumeric(dblAge) Then 'Checks to see if age input is numeric 
     'If age input is not numeric, throws error message up, changes textbox background color to red, focuses user on error and exits sub. 
     MessageBox.Show("Your age must be a number. Please try again.", "Age Error", MessageBoxButtons.OK) 
     txtAge.BackColor = Color.Red 
     txtAge.Focus() 
     Exit Sub 
    Else 
     dblFeet = CDbl(txtFeet.Text) 
     dblInches = CDbl(txtInches.Text) 
     dblAge = CDbl(txtAge.Text) 
    End If 
+0

Нет необходимости проверять ** и ** конвертировать, если вы используете 'Double.TryParse()' - он будет делать как – Plutonix

ответ

0

О, я понял. Я тестировал dblVariable, когда я должен был тестировать txtVariable.text. Facepalm.

+0

. Это проблема с этими старомодными функциями VB - они почти все принимают аргументы параметра Object так что вы можете передать что-нибудь и совершить ошибки – Plutonix

+0

Спасибо за всю информацию @plutonix, я действительно предлагаю это. Мы учимся использовать CSng, CInt и т. Д. Похоже, что это лишено, хотя (как и мой профессор в большинстве случаев). –

+0

Это/они не устарели * официально * просто по общему мнению, различные методы Parse немного более надежны, и если вы привыкнете не использовать устаревшие методы, переключиться на C# намного проще. – Plutonix

0

Предполагая, что вы заинтересованы в образовании, а не просто класс, здесь является более емким способом с использованием NET методы:

' assumes all the values are form/class 
' leval variables 
Private nAge As Int32 

Тогда для проверки:

' if it parses, then nAge will have the value 
    If Integer.TryParse(tbAge.Text, nAge) = False Then 
     MessageBox.Show("Please enter a valid integer for Age", 
          "Annoying MsgBox", MessageBoxButtons.OK) 
     Return 
    End If 
  • Я впадина знаете, почему вы используете парные - действительно ли вы ожидаете "5.8" футов или вход "28.7" для возраста?
  • Использование Integer.TryParse можно выполнить только один тест: он обнаружит/не на пустые строки, а также "I like pie"
  • Вместо того, чтобы сказать им одну ошибку в то время, вы могли бы накопить плохие элементы и сказать им все, что неправильно , ErrorProvider подходит для этого.

Одна из проблем со старыми функциями VB заключается в том, что почти все - As Object. Это позволяет делать что-то вроде IsNumeric(dblAge), которое всегда будет правдой. Методы NET более строго типизированы, поэтому вы можете передавать только строку.

Смежные вопросы