0

I have two forms:

  1. Editor
  2. Tables

On the "Editor" form I have a "KeyDown" event which opens the "Tables" form when the F5 key is down.

    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

On the "Tables" form I have some code which get's a List(Of String) and loops through it, adding rows to a datagridview on the form.

        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

The problem is that when the loop has iterated twice, the flow will exit the loop and go back to the KeyDown event, which then finishes.

If I empty out the code in the If Line.Contains statement, and insert a MessageBox, everything iterates just fine.

I hope someone knows the answer.

Thanks and best regards!

EDIT: I can see that DataGridView.Rows.Add(Row) is at fault, I have no idea why though.

EDIT: I fixed it by changing the "For Each" loop to a "For" loop, and cloning the latest added 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
  • If `Line.Contains("MetaTable")` causes "unexpected behaviour" aka missing iterations - then you'll have to debug and check whether you have the data you expect or whether you have incorrect logic. It might be the data isn't what you think it is. – Allan S. Hansen Jan 26 '15 at 12:08
  • I'm 100% sure that it is not the problem. "MetaTable" will always be present as "Line" contains a generated XML output where the "MetaTable" is used. I have checked this manually and also by replacing the code in the `If Line.Contains` with a messagebox. The loop iterates just fine with a messagebox in the if statement. –  Jan 26 '15 at 12:57
  • Does bumping work? Test –  Jan 29 '15 at 10:21

1 Answers1

0

EDIT: I fixed it by changing the "For Each" loop to a "For" loop, and cloning the latest added 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