VB.NET For Each Loop 过早退出/代码 returns 在完成之前给调用者
VB.NET For Each Loop exits prematurely / Code returns to caller before finishing
我有两种形式:
- 编辑器
- 表格
在 "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
我有两种形式:
- 编辑器
- 表格
在 "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