【问题标题】:VB.NET For Each Loop exits prematurely / Code returns to caller before finishingVB.NET For Each 循环过早退出/代码在完成前返回调用者
【发布时间】:2015-01-26 11:10:54
【问题描述】:

我有两种形式:

  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) 并循环遍历它,将行添加到表单上的 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

【问题讨论】:

  • 如果Line.Contains("MetaTable") 导致“意外行为”也就是缺少迭代 - 那么您将不得不调试并检查您是否有您期望的数据或您是否有不正确的逻辑。可能是数据不是您认为的那样。
  • 我 100% 确定这不是问题所在。 “MetaTable”将始终存在,因为“Line”包含使用“MetaTable”的生成 XML 输出。我已经手动检查了这一点,还用消息框替换了If Line.Contains 中的代码。使用 if 语句中的消息框循环迭代就好了。
  • 碰撞有效吗?测试

标签: loops foreach iteration datagridviewrow


【解决方案1】:

编辑:我通过将“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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 2018-08-22
    相关资源
    最近更新 更多