2016-03-14 3 views
1

Я работаю над очень простым приложением времени для работы. У меня есть поле со списком, в котором заполняются имена сотрудников, а также поле списка, в котором отображаются, кто из сотрудников зарегистрирован. Если сотрудник уже зарегистрирован (отображается в списке ListIn), то субтаймер должен уведомить пользователя и выйти, не пытаясь добавить человека в поле ListIn снова. К сожалению, я получаю сообщение «уже синхронизировано», но человек снова добавляется в поле ListIn.VB.NET - невозможно выйти из цикла For/Next

Вот мой код:

Private Sub btnIn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIn.Click 
    For i As Integer = 0 To listIn.Items.Count - 1 
     If (listIn.Items(i).ToString.Contains(cboEmployees.SelectedItem)) Then 
      MsgBox("Error - employee is already clocked in.", vbOKOnly, "Error") 
      Exit For 
     Else 
      listIn.Items.Add(cboEmployees.SelectedItem) 
      timerDateTime.Stop() ' Turn off the timer, prepare to display the clock-in label. 
      lblTime.Text = "Success!" 
      lblDate.Text = "You are clocked in." 
      timerLabel.Start() ' Turn on the timer for the clock-in label. 
     End If 
    Next 
    cboEmployees.SelectedIndex = 0 ' After clocking in, set dropdown box to blank, disables buttons again. 
    listIn.Refresh() 
End Sub 

Любой помощь с этим небольшим вопросом будет наиболее высокой оценкой. Я использую VB.NET 2010 Professional, если это имеет значение.

Спасибо всем.

+0

Вы пробовали _debugging_ it? –

+0

a) Включить параметр Strict b) Вы добавляете в список в цикле, чтобы после того, как вы его запустили, вы также должны получить уже синхронизированный в msg. C) Если элементы управления использовали DataSource, вы, вероятно, могли бы фильтровать это довольно легко. – Plutonix

ответ

1

Здесь вы дублируете две различные задачи: поиск в списке и обновление списка. Внутри цикла For вы проверяете, соответствует ли текущая запись сотруднику, и если он не соответствует, вы добавляете сотрудника. Это означает, что, если первая запись не соответствует сотруднику, вы выполните часть «Else» вашего оператора If и добавите сотрудника. Поэтому, даже если вторая запись совпадает, слишком поздно - вы уже добавили сотрудника, потому что первая запись не совпала.

Что вы хотите сделать, это отделить поиск от обновления. Сделайте логическую переменную, называемую «isClockedIn», и установите для нее значение false. Затем пройдите через цикл For и если запись соответствует, установите isClockedIn в true и выйдите из цикла. Затем, после цикла For, выполните другой оператор If, который проверяет isClockedIn и либо обновляет список, либо отображает ошибку.

+0

Спасибо, MarkNFI - это сработало отлично. Очень признателен. Я учусь ... медленно, но учись. С наилучшими пожеланиями, – DaveB

0

Завершенный рабочий код, если у кого-либо еще есть эта проблема.

Private Sub btnIn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIn.Click 
    Dim isIn As Boolean = False 
    For i As Integer = 0 To listIn.Items.Count - 1 
     If (listIn.Items(i).ToString.Contains(cboEmployees.SelectedItem)) Then 
      isIn = True 
      MsgBox("Error - employee is already clocked in.", vbOKOnly, "Error") 
      Exit For 
     End If 
    Next 
    If isIn = False Then 
     listIn.Items.Add(cboEmployees.SelectedItem) 
     timerDateTime.Stop() ' Turn off the timer, prepare to display the clock-in label. 
     lblTime.Text = "Success!" 
     lblDate.Text = "You are clocked in." 
     timerLabel.Start() ' Turn on the timer for the clock-in label. 
    End If 


    cboEmployees.SelectedIndex = 0 ' After clocking in, set dropdown box to blank, disables buttons again. 
    listIn.Refresh() 
End Sub 
Смежные вопросы