如何遍历RowCount / Rows.Count更改的DataGridView

时间:2017-01-15 08:40:45

标签: vb.net winforms datagridview

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

DataGridView显示地点之间的距离和估计时间 - 称为路线腿数据,称为“一般视图”

我已经实现了一个CheckBox,可以在常规视图和详细视图之间进行选择。检查CheckBox时,我试图遍历所有Route Leg条目并插入Route Steps,这是有关Leg条目的详细信息。

我尝试了各种循环选项:For..Next,For Each ... Next,While ... End While,只有第一行(Route Leg)被处理,即使我还有5个Route Leg条目

重要说明:请记住,选择详细信息视图时,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

2 个答案:

答案 0 :(得分:1)

我的不耐烦以及重新聚焦为我提供了答案。

我的重点始终放在DataGridView上,以及关于控件中包含的行数的反馈。

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

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

如果DataGridView中的最后一行到达并且退出了While ... End While循环,我添加了一个触发器(True / False)设置为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

结果如下并且没有错误:

enter image description here

enter image description here

答案 1 :(得分:0)

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