随笔 06 渲染 DataGridView (GrdList)或根据单元格的值显示不同的背景

156 阅读3分钟

你目前的代码在渲染 DataGridView (GrdList) 时,出现了只显示最后一行的问题。原因是你在循环中添加新行的操作只发生了一次,而所有数据都被添加到这一行里。

在你的代码中,Dim i = .Rows.Add() 只在 With GrdList 块执行时调用了一次。因此,每次循环都是在修改同一行(即 i 指向的行),导致最后只看到最后一行的结果。

解决方法

你需要在每次遍历 dt.Rows 中的数据时,向 DataGridView 中添加新行。具体做法是在外层的行循环中,每次都添加一行,并更新当前行的索引 i

可以将代码修改为如下方式:

vb
コードをコピーする
If dt.Rows.Count > 0 Then
    With GrdList
        .Rows.Clear() ' 清空 DataGridView 的所有行
        For Each dr In dt.Rows ' 遍历 DataTable 的每一行
            Dim i = .Rows.Add() ' 每次都新增一行,返回该行的索引
            For Each dc As DataColumn In dt.Columns ' 遍历 DataTable 的每一列
                Dim col = .Columns.OfType(Of DataGridViewColumn).FirstOrDefault(Function(x) x.HeaderText = dc.ColumnName)
                If col IsNot Nothing Then
                    ' 将每一列的值赋给 DataGridView 对应的单元格
                    .Rows(i).Cells(col.Index).Value = dr(dc)
                End If
            Next
        Next
    End With
End If

修改点

  1. Dim i = .Rows.Add() 放入 For Each dr In dt.Rows 循环

    • 每次遍历 DataTable 的行时都添加一行,这样 i 变量在每次循环时都指向新添加的那一行。
  2. 在每一行中再遍历所有列

    • 然后将 DataTable 的值逐列插入到对应的 DataGridView 列中。

效果

这样修改后,GrdList 将会根据 DataTable 的行数动态添加新行,并正确渲染每一行的数据,而不再只显示最后一行。


你可以在 DataGridView 中遍历列时,检查 HeaderText 是否是 "比重合否" 或 "屈折率合否",然后根据单元格的值将背景颜色设置为红色或黄色。

修改后的代码示例:

vb
コードをコピーする
If dt.Rows.Count > 0 Then
    With GrdList
        .Rows.Clear() ' 清空 DataGridView 的所有行
        For Each dr In dt.Rows ' 遍历 DataTable 的每一行
            Dim i = .Rows.Add() ' 每次都新增一行,返回该行的索引
            For Each dc As DataColumn In dt.Columns ' 遍历 DataTable 的每一列
                Dim col = .Columns.OfType(Of DataGridViewColumn).FirstOrDefault(Function(x) x.HeaderText = dc.ColumnName)
                If col IsNot Nothing Then
                    ' 将每一列的值赋给 DataGridView 对应的单元格
                    Dim cellValue As String = dr(dc).ToString()
                    .Rows(i).Cells(col.Index).Value = cellValue

                    ' 判断 HeaderText 是否为 "比重合否" 或 "屈折率合否"
                    If col.HeaderText = "比重合否" OrElse col.HeaderText = "屈折率合否" Then
                        If cellValue = "不合格" Then
                            ' 设置单元格背景为红色
                            .Rows(i).Cells(col.Index).Style.BackColor = Color.Red
                        ElseIf cellValue = "合格" Then
                            ' 设置单元格背景为黄色
                            .Rows(i).Cells(col.Index).Style.BackColor = Color.Yellow
                        End If
                    End If
                End If
            Next
        Next
    End With
End If

关键修改点:

  1. 判断 HeaderText:

    • 使用 If col.HeaderText = "比重合否" OrElse col.HeaderText = "屈折率合否" 来检查列标题是否为 "比重合否" 或 "屈折率合否"。
    • 如果列标题匹配,才执行进一步的背景颜色设置操作。
  2. 根据单元格的值设置背景颜色

    • 如果单元格值为 "不合格",将背景颜色设置为红色。
    • 如果单元格值为 "要確認",将背景颜色设置为黄色。
  3. 使用 Style.BackColor:

    • Style.BackColor 用于修改 DataGridViewCell 的背景颜色。

效果:

  • 在你遍历 DataGridView 的每一行和列时,如果列标题为 "比重合否" 或 "屈折率合否",并且单元格值为 "不合格""要確認",将会设置该单元格的背景颜色为红色或黄色。