【问题标题】:How do I loop through a DataGridView where RowCount / Rows.Count changes如何循环遍历 RowCount / Rows.Count 更改的 DataGridView
【发布时间】:2017-01-15 08:40:45
【问题描述】:

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

DataGridView 显示地点之间的距离和估计时间 - 称为 Route Leg Data 并被称为 General View

我已经实现了一个复选框来在一般视图和详细视图之间进行选择。当 CheckBox 被选中时,我试图遍历所有 Route Leg 条目并插入 Route Steps,这是有关 Leg 条目的详细信息。

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

Important: Keep in mind that when the Detail View is selected, the DataGridView row count increments for every new Route Step entry that gets inserted.

我尝试同时使用 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

【问题讨论】:

    标签: vb.net winforms datagridview


    【解决方案1】:

    我的不耐烦以及重新集中注意力为我提供了答案。

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

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

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

    如果到达 DataGridView 中的最后一行并且退出 While...End While 循环,我添加了一个触发器(真/假)设置为真。

    '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
    

    结果如下,没有错误:

    之前

    之后

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我使用复选框来显示或隐藏详细信息。此外,在获取 Leg Data 时,显示 Step 数据也没有必要的开销,而且由于 Leg 最多可以包含 50 个 Step,因此 Step 数据会使显示变得混乱。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      • 2012-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多