Для ... Next L oop Проблема с синхронизацией - PullRequest
0 голосов
/ 12 июля 2020

У меня странная проблема с запуском этого l oop. Кажется, он запускается только один раз, независимо от строк, доступных в таблице данных. Но если я помещу это окно сообщения чуть выше ключевого слова Next, циклы начнут работать должным образом. Кажется, здесь есть какая-то проблема с синхронизацией. Пожалуйста, расскажите, как ограничить работу l oop в соответствии с количеством строк. L oop останавливается в окне сообщения, я нажимаю ОК, и он работает нормально. Но если я удалю это окно сообщения, кажется, что оно запускается только один раз. Просто чтобы убедиться, что в условии If он возвращает не равно на первой итерации, и, таким образом, l oop не выходит согласно коду!

 For CheckShopNames As Integer = 0 To DTShopNameSearch.Rows.Count - 1

            If DTShopNameSearch.Rows(CheckShopNames).Item(1) = txtshop.Text Then
             
                MsgBox(DTShopNameSearch.Rows(CheckShopNames).Item(1))  'FOR TESTING

                SaveFlag = True
                Exit For
            ElseIf DTShopNameSearch.Rows(CheckShopNames).Item(1) <> txtshop.Text Then
                SaveFlag = False
               

            End If
            MsgBox(10)  'FOR TESTING
        Next 
   

1 Ответ

1 голос
/ 13 июля 2020

Попробуйте это, чтобы узнать, сколько раз запускается ваша l oop. Включите Option Strict. Вы тестируете второй столбец в DataTable.

Private Sub OpCode()
    Dim counter = 1
    For Each row As DataRow In DTShopNameSearch.Rows
        If row(1).ToString = txtshop.Text Then 
            MessageBox.Show(row(1).ToString)  'FOR TESTING
            SaveFlag = True
            MessageBox.Show($"I am exiting For loop after {counter} iterations.")
            Exit For
        Else
            SaveFlag = False
        End If
        counter += 1
    Next
    MessageBox.Show($"For loop is done and there were {counter} iterations.")
End Sub

EDIT

Вот фактический тест, выполненный на моем компьютере. Я немного изменил код. Нет причин повторно устанавливать для SaveFlag значение False. Я не инициализировал счетчик явно. Я использовал локальные данные и имена элементов управления.

Private SaveFlag As Boolean

Private Sub OpCode()
    Dim dt = LoadCoffeeTable()
    Debug.Print(dt.Rows.Count.ToString)
    Dim counter As Integer
    SaveFlag = False
    For Each row As DataRow In dt.Rows 'DTShopNameSearch.Rows
        counter += 1
        If row(1).ToString = TextBox1.Text Then
            MessageBox.Show(row(1).ToString)  'FOR TESTING
            SaveFlag = True
            MessageBox.Show($"I am exiting For loop after {counter} iterations.")
            Exit For
        End If
    Next
    MessageBox.Show($"For loop is done and there were {counter} iterations.")
End Sub

Private Function LoadCoffeeTable() As DataTable
    Dim dt As New DataTable
    Using cn As New SqlConnection(My.Settings.CoffeeConnection),
           cmd As New SqlCommand("Select Top 10 ID, Name, IsExtraBold, IsFavorite From Coffees", cn)
        cn.Open()
        dt.Load(cmd.ExecuteReader)
    End Using
    Return dt
End Function

Я знаю, что в третьей строке есть столбец «Имя», содержащий «зеленый». Я ввел это TextBox1. Окна сообщений появились, как и ожидалось.

...