Vb.net 如何循环遍历一个DataGridView,其中RowCount/Rows.Count发生了更改

Vb.net 如何循环遍历一个DataGridView,其中RowCount/Rows.Count发生了更改,vb.net,winforms,datagridview,Vb.net,Winforms,Datagridview,我有一个带有DataGridView的VB.Net表单,我希望在详细视图和一般视图之间进行更改 DataGridView显示位置之间的距离和估计时间,称为路线段数据,称为常规视图 我实现了一个复选框,可以在常规视图和详细视图之间进行选择。选中该复选框后,我将尝试循环遍历所有的路由分支条目,并插入路由步骤,这是关于分支条目的详细信息 我尝试了各种循环选项:For..Next、For Each..Next、While…End While,并且仅处理第一行(路由分支),即使我还有5个路由分支条目 重要

我有一个带有DataGridView的VB.Net表单,我希望在详细视图和一般视图之间进行更改

DataGridView显示位置之间的距离和估计时间,称为路线段数据,称为常规视图

我实现了一个复选框,可以在常规视图和详细视图之间进行选择。选中该复选框后,我将尝试循环遍历所有的路由分支条目,并插入路由步骤,这是关于分支条目的详细信息

我尝试了各种循环选项:For..Next、For Each..Next、While…End While,并且仅处理第一行(路由分支),即使我还有5个路由分支条目

重要提示:请记住,当选择“详细信息”视图时,每个插入的新路由步骤条目的DataGridView行计数都会增加

我尝试同时使用dgv.RowCount和dgv.Rows.Count,但始终得到相同的结果

我已经添加了一些代码来显示我试图实现的目标。任何帮助或指导都将不胜感激

'Show / Hide Route Step Data
Private Sub chkShowRouteStep_CheckedChanged(sender As Object, e As EventArgs) Handles chkShowRouteStep.CheckedChanged
    Try
        If chkShowRouteStep.Checked Then
            'Show Route Steps
            For i As Integer = 0 To dgvQuote.RowCount - 1
                txtRowCount.Text = i
                If dgvQuote.Rows(i).Cells(0).Value.ToString <> "" Then
                    For j As Integer = 1 To 5
                        i += 1
                        dgvQuote.Rows.Insert(i, "Step")
                        'dgvQuote.Rows.Insert(j + i, "Step")

                    Next
                End If
            Next

        Else
            'Hide Route Steps - WORKS GREAT
            For i As Integer = dgvQuote.RowCount - 1 To 0 Step -1
                If dgvQuote.Rows(i).Cells(0).Value.ToString = "Step" Then
                    dgvQuote.Rows.RemoveAt(i)
                End If
            Next
        End If
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub
“显示/隐藏路线步骤数据”
私有子chkShowRouteStep_CheckedChanged(发送方作为对象,e作为事件参数)处理chkShowRouteStep.CheckedChanged
尝试
如果chkShowRouteStep.已选中,则
'显示路线步骤
对于i作为整数=0到dgvQuote.RowCount-1
txtRowCount.Text=i
如果dgvQuote.Rows(i).Cells(0).Value.ToString“”则
对于j,作为整数=1到5
i+=1
dgvQuote.Rows.Insert(i,“步骤”)
'dgvQuote.Rows.Insert(j+i,“步骤”)
下一个
如果结束
下一个
其他的
“隐藏路线步骤-效果很好
对于i As Integer=dgvQuote.RowCount-1到0步骤-1
如果dgvQuote.Rows(i).Cells(0).Value.ToString=“步骤”,则
dgvQuote.Rows.RemoveAt(i)
如果结束
下一个
如果结束
特例
MsgBox(例如消息)
结束尝试
端接头

既然代码中的注释表示要隐藏路线步骤,为什么不这样做呢?不要删除和插入行,而是用所有内容填充网格,然后使用复选框设置行。可见属性?

我的不耐烦和重新聚焦为我提供了答案

我的重点始终是DataGridView以及它对控件中包含的行数的反馈

但是,循环的执行在循环执行开始时获取了行数的快照,并且没有在每次将行添加到DataGridView时更新行数

我采用了一种不同的方法,将当前循环数(I+=1)与DataGridView中的当前行数(dgv.rows.Count-1)进行比较,从而强制重新检查行数。这意味着添加到DataGridView的任何新行现在都将计入

我添加了一个触发器(True/False),如果DataGridView中的最后一行是reach,而While…End While循环退出,则将其设置为True

'Show / Hide Route Step Data
Private Sub chkShowRouteStep_CheckedChanged(sender As Object, e As EventArgs) Handles chkShowRouteStep.CheckedChanged
    Try
        Dim lastRow As Boolean = False 'This will get set when we have reached the last row in the DGV
        Dim i As Integer = 0

        If chkShowRouteStep.Checked Then
            'Show Route Steps
            While lastRow <> True

                txtRowCount.Text = i

                If dgvQuote.Rows(i).Cells(0).Value.ToString <> "" Then

                    For j As Integer = 1 To 2
                        'i += 1
                        dgvQuote.Rows.Insert(i + j, "", "Step")

                    Next

                End If
                'Check to see if we have reached the last row, set lastRow to TRUE if it is the last row

                If i = dgvQuote.Rows.Count - 1 Then
                    lastRow = True
                End If

                i += 1

            End While

        Else
            'Hide Route Steps - WORKS GREAT
            For x As Integer = dgvQuote.RowCount - 1 To 0 Step -1
                If dgvQuote.Rows(x).Cells(1).Value.ToString = "Step" Then
                    dgvQuote.Rows.RemoveAt(x)
                End If
            Next
        End If
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub
“显示/隐藏路线步骤数据”
私有子chkShowRouteStep_CheckedChanged(发送方作为对象,e作为事件参数)处理chkShowRouteStep.CheckedChanged
尝试
Dim lastRow As Boolean=False“当我们到达DGV中的最后一行时,将设置此值
尺寸i为整数=0
如果chkShowRouteStep.已选中,则
'显示路线步骤
而最后一行是真的
txtRowCount.Text=i
如果dgvQuote.Rows(i).Cells(0).Value.ToString“”则
对于j,作为整数=1到2
'i+=1
dgvQuote.Rows.Insert(i+j,“,”步骤“)
下一个
如果结束
'检查是否已到达最后一行,如果是最后一行,请将lastRow设置为TRUE
如果i=dgvQuote.Rows.Count-1,则
lastRow=True
如果结束
i+=1
结束时
其他的
“隐藏路线步骤-效果很好
对于x As Integer=dgvQuote.RowCount-1到0步骤-1
如果dgvQuote.Rows(x).Cells(1).Value.ToString=“步骤”,则
dgvQuote.Rows.RemoveAt(x)
如果结束
下一个
如果结束
特例
MsgBox(例如消息)
结束尝试
端接头
结果如下,无错误:

以前

之后

我使用复选框显示或隐藏详细信息。此外,在获取腿部数据时,显示步骤数据也不需要额外的开销,而且由于腿部最多可以包含50个步骤,因此步骤数据会使显示混乱。