VB.NET для каждого цикла завершается преждевременно / код возвращается вызывающей стороне до завершения

У меня есть две формы:

  1. редактор
  2. таблицы

В форме "Редактор" у меня есть событие "KeyDown", которое открывает форму "Таблицы", когда клавиша F5 нажата.

    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

В форме "Таблицы" у меня есть некоторый код, который получает List(Of String) и проходит по нему, добавляя строки в представление данных в форме.

        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 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

1 ответ

Решение

РЕДАКТИРОВАТЬ: я исправил это, изменив цикл "Для каждого" на цикл "Для" и клонируя последнюю добавленную строку.

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
Другие вопросы по тегам