2015-11-20 3 views
1

Так что я нахожусь в интернатуре для школы, которая заставляет меня кодировать программу с помощью VB.NET. Одна из форм имеет три комбинированных блока, которые должны иметь выбор, выбранный в каждом, прежде чем двигаться дальше. Если пользователь пропустил одно из списков combobox, я пытаюсь привлечь его к себе, чтобы вернуться и сделать выбор, прежде чем продолжить. У меня есть, если заявление, которое работает точно, как я хочу, чтобы:Более эффективная ошибка ловли?

If cboYear.SelectedIndex = -1 Then 
     warningString = warningString + "Year" & vbNewLine & "Vendor" & vbNewLine & "Report" 
     txtYear.ForeColor = Color.Red 
     TextBox7.ForeColor = Color.Red 
     txtReport.ForeColor = Color.Red 
     MessageBox.Show(warningString) 
    ElseIf cboVendorName.SelectedIndex = -1 Then 
     warningString = warningString + "Vendor" + vbNewLine & "Report" 
     txtYear.ForeColor = Color.Black 
     TextBox7.ForeColor = Color.Red 
     txtReport.ForeColor = Color.Red 
     MessageBox.Show(warningString) 
    ElseIf cboReport.SelectedIndex = -1 Then 
     warningString = warningString + "Report" & vbNewLine 
     txtYear.ForeColor = Color.Black 
     TextBox7.ForeColor = Color.Black 
     txtReport.ForeColor = Color.Red 
     MessageBox.Show(warningString) 
    Else 
     Main.Show() 
     Me.Hide() 
    End If 

(warningString является родовой строкой, которая говорит что-то вроде «Пожалуйста, заполните следующее:»)

Так как я сказал это работает именно так, как я этого хочу, и его довольно легко следовать моей логике здесь. Мой вопрос: как я могу сделать этот код более эффективным? Я попробовал массивы для выбора выделенных ячеек, и я попробовал цикл for и select case, чтобы попытаться упорядочить код безрезультатно. Массив всегда выходит из строя и возвращает исключение NullReferenceException, прежде чем он попадает в мой цикл Select Case или For, чтобы узнать, есть ли значение в выпадающем списке или нет.

Если есть кто-то, кто может помочь мне пройти через логику получения какой-то петли для работы над этим, это было бы потрясающе. Я не прошу рабочий код или что-то в этом роде, однако, если есть решение, которое можно найти, и я сам туда доберусь, я отправлю его здесь для будущих ссылок для людей. Кто знает, это может быть даже самым эффективным способом?

Редактировать: Plutonix был достаточно любезен, чтобы предложить некоторые комментарии по моему вопросу, и он поднял точку зрения о том, что утверждения if не являются взаимоисключающими. Это связано с тем, что сборники заполняются наборами данных, и каждое CBO в порядке определяет, какая информация из наборов данных будет заполнять следующую. Таким образом, в зависимости от того, какой год выбран в поле «Год», определяет, какие поставщики заполняют комбобокс «Vendor» и определяет, какие отчеты заполняются в поле «Отчет».

+0

VB6 не имеет 'NullReferenceException', вы уверены, что вы не используете VB.NET – Plutonix

+0

Нет, это точно vb6, я просто попробовал запустить Select Case, и вот что мне рассказала Visual Studio: Необработанный тип исключения 'System .NullReferenceException 'произошло в ETL.exe ****** Дополнительная информация: Ссылка на объект не установлена ​​в экземпляр объекта. – TGautier

+0

Это массив объектов, который хранится, например: errorArray (0) = cboYear.SelectedIndex, а затем тестовое выражение Select Case равно -1 – TGautier

ответ

0

Поскольку каждый тест делает что-то другое, цикл будет неуклюжим. Даже если вы включите B только после того, как A будет проверен, вам, возможно, придется разрешить им отменять предыдущий выбор. Код может быть сжата, хотя:

Dim IsValid As Boolean = True 
txtYear.ForeColor = Color.Black 
TextBox7.ForeColor = Color.Black 
txtReport.ForeColor = Color.Black 

If cboYear.SelectedIndex = -1 Then 
    warningString = warningString & "Year" & vbNewLine & "Vendor" & vbNewLine & "Report" 
    txtYear.ForeColor = Color.Red 
    TextBox7.ForeColor = Color.Red 
    txtReport.ForeColor = Color.Red 
    IsValid = False 
End If 

If cboVendorName.Enabled AndAlso cboVendorName.SelectedIndex = -1 Then 
    warningString = warningString & "Vendor" & vbNewLine & "Report" 
    TextBox7.ForeColor = Color.Red 
    txtReport.ForeColor = Color.Red 
    IsValid = False 
End If 

If cboReport.Enabled AndAlso cboReport.SelectedIndex = -1 Then 
    warningString = warningString & "Report" & vbNewLine 
    txtReport.ForeColor = Color.Red 
    IsValid = False 
End If 

' See note 
If IsValid = False Then 
    MessageBox.Show(warningString) 
Else 
    ' DONT use default form instances! 
    Main.Show() 
    Me.Hide() 
End If 

IF немного изменился: я не знаю, как вы сказать, какие из них являются активными, код выше использует .Enabled, чтобы увидеть, если каждый из них был создан для использования. Таким образом, вы не будете сообщать о ошибках в CBO 2 и 3 при проверке №1.

Я бы сделал это функцией, которую Returns IsValid и позвонил вызывающему коду управлять формами, чтобы показать ... и не использовать экземпляры формы по умолчанию.

+0

Вы также можете посмотреть на ErrorProvider. Он поместит немного красных '!' Рядом с плохими вещами. – Plutonix

+0

Еще раз большое спасибо за вашу помощь. Это ответ, как объяснил ранее Плутоникс, цикл был бы слишком громоздким для проверки всей проверяемой информации. Таким образом, в этой ситуации, если утверждения действительно подходят, и приведенный выше код лучше отражает то, что я собираюсь сделать. – TGautier

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