对于..下一个环路定时问题



我在运行这个循环时遇到了一个奇怪的问题。它似乎只运行一次,而与数据表中可用的行无关。但是,如果我将该消息框放在Next关键字的正上方,则循环将按预期开始工作。这里似乎有某种时间问题。请指导如何根据行数约束循环。循环在消息框处停止,我单击"确定",然后它正常运行。但如果我删除那个消息框,它似乎只运行一次。只是为了确保,在If条件下,它在第一次迭代中返回不等于,因此循环不会按照代码退出!

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 

试试看循环运行了多少次。启用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

编辑

这是在我的电脑上进行的实际测试。我把代码改了一点。没有理由重复将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

我碰巧知道第三行有一个Name列;绿色";。我输入的是TextBox1。消息框按预期显示。

最新更新