VB.NET For Each Loop 过早退出/代码 returns 在完成之前给调用者

VB.NET For Each Loop exits prematurely / Code returns to caller before finishing

我有两种形式:

  1. 编辑器
  2. 表格

在 "Editor" 表单上,我有一个 "KeyDown" 事件,它在按下 F5 键时打开 "Tables" 表单。

    Private Sub DataGridView_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles DataGridView.KeyDown
    Select Case e.KeyCode
        Case Keys.Delete
            For Each Row As DataGridViewRow In DataGridView.Rows
                If Row.IsNewRow Then
                    DataGridView.Rows.Remove(Row)
                End If
            Next
        Case Keys.F5
            Tabels.Show()
    End Select
End Sub

在 "Tables" 表单上,我有一些代码获取一个 List(Of String) 并循环遍历它,将行添加到表单上的 datagridview。

        Dim Tables As List(Of String)
    Tables = NAV2013BLOBReader.ReturnXML("SELECT [Metadata] FROM dbo.[Object Metadata] WHERE [Object Type] = 1")

    'Sæt egenskaber på datagridview
    DataGridView.AutoGenerateColumns = False

    Dim Row As DataGridViewRow = DataGridView.Rows(0).Clone()
    For Each Line As String In Tables
        If Line.Contains("MetaTable") Then
            Dim LanguageStartIndex As Integer = Line.IndexOf("CaptionML=""") + 15
            Dim LanguageEndIndex As Integer = Line.IndexOf(";", LanguageStartIndex)

            Dim IdStartIndex As Integer = Line.IndexOf("ID=""") + 4
            Dim IdEndIndex As Integer = Line.IndexOf(""" CaptionML") - IdStartIndex

            Dim NameStartIndex As Integer = Line.IndexOf("Name=""") + 6
            Dim NameEndIndex As Integer = Line.IndexOf(""" LookupFormID") - NameStartIndex

            'Tildel cellerne værdier
            Row.Cells(0).Value = Line.Substring(IdStartIndex, IdEndIndex)
            Row.Cells(1).Value = Line.Substring(NameStartIndex, NameEndIndex)
            Row.Cells(2).Value = Line.Substring(LanguageStartIndex, LanguageEndIndex - LanguageStartIndex)

            DataGridView.Rows.Add(Row)
            DataGridView.Refresh()
        End If
    Next

    DataGridView.AllowUserToAddRows = False

问题是当循环迭代两次后,流程将退出循环并返回到 KeyDown 事件,然后结束。

如果我清空 If Line.Contains 语句中的代码,并插入一个 MessageBox,一切都会很好。

希望有人知道答案。

谢谢并致以最诚挚的问候!

编辑:我可以看出 DataGridView.Rows.Add(Row) 有问题,但我不知道为什么。

编辑:我通过将 "For Each" 循环更改为 "For" 循环并克隆最新添加的行来修复它。

For i = 0 To Tables.Count - 1
        Dim Row As DataGridViewRow = DataGridView.Rows(i).Clone()
        If Tables(i).Contains("MetaTable") Then
            Dim LanguageStartIndex As Integer = Tables(i).IndexOf("CaptionML=""") + 15
            Dim LanguageEndIndex As Integer = Tables(i).IndexOf(";", LanguageStartIndex)

            Dim IdStartIndex As Integer = Tables(i).IndexOf("ID=""") + 4
            Dim IdEndIndex As Integer = Tables(i).IndexOf(""" CaptionML") - IdStartIndex

            Dim NameStartIndex As Integer = Tables(i).IndexOf("Name=""") + 6
            Dim NameEndIndex As Integer = Tables(i).IndexOf("""", Tables(i).IndexOf("Name=""") + 6) - NameStartIndex

            'Tildel cellerne værdier
            Row.Cells(0).Value = Tables(i).Substring(IdStartIndex, IdEndIndex)
            Row.Cells(1).Value = Tables(i).Substring(NameStartIndex, NameEndIndex)
            Row.Cells(2).Value = Tables(i).Substring(LanguageStartIndex, LanguageEndIndex - LanguageStartIndex)

            'Tilføj række til DataGridView og opfrisk kontrollen, så at de nye rækker bliver vist med det samme
            DataGridView.Rows.Add(Row)
            DataGridView.Refresh()
        End If
    Next

编辑:我通过将 "For Each" 循环更改为 "For" 循环并克隆最新添加的行来修复它。

For i = 0 To Tables.Count - 1
    Dim Row As DataGridViewRow = DataGridView.Rows(i).Clone()
    If Tables(i).Contains("MetaTable") Then
        Dim LanguageStartIndex As Integer = Tables(i).IndexOf("CaptionML=""") + 15
        Dim LanguageEndIndex As Integer = Tables(i).IndexOf(";", LanguageStartIndex)

        Dim IdStartIndex As Integer = Tables(i).IndexOf("ID=""") + 4
        Dim IdEndIndex As Integer = Tables(i).IndexOf(""" CaptionML") - IdStartIndex

        Dim NameStartIndex As Integer = Tables(i).IndexOf("Name=""") + 6
        Dim NameEndIndex As Integer = Tables(i).IndexOf("""", Tables(i).IndexOf("Name=""") + 6) - NameStartIndex

        'Tildel cellerne værdier
        Row.Cells(0).Value = Tables(i).Substring(IdStartIndex, IdEndIndex)
        Row.Cells(1).Value = Tables(i).Substring(NameStartIndex, NameEndIndex)
        Row.Cells(2).Value = Tables(i).Substring(LanguageStartIndex, LanguageEndIndex - LanguageStartIndex)

        'Tilføj række til DataGridView og opfrisk kontrollen, så at de nye rækker bliver vist med det samme
        DataGridView.Rows.Add(Row)
        DataGridView.Refresh()
    End If
Next