0

如何根据条件更改 DataGridView 的所有行的字体样式?

我的条件是if Cell Value Equal 0 then FontStyle = Strikeout otherwise Regular

Private Function DetailGridViewSetStyle()
    Dim dgv As DataGridView = DetailDataGridView
    Dim dgvInd As Integer = dgv.CurrentRow.Index
   
    For cc As Integer = 0 To dgv.ColumnCount - 1
        If dgv.Item(4, dgvInd).Value = 0 Then
            dgv.DefaultCellStyle.Font = New Font("ARIAL", 8, FontStyle.Strikeout)
        ElseIf dgv.Item(4, dgvInd).Value = 1 Then
            dgv.DefaultCellStyle.Font = New Font("ARIAL", 8, FontStyle.Regular)
        End If
    Next
End Function
4

2 回答 2

1
  • 仅在需要返回某些内容时才使用“功能”,这不是您的情况,请改用 Sub。
  • dgv.DefaultCellStyle.Font将为所有数据网格设置字体样式,您需要从指定行设置字体样式,然后使用row.DefaultCellStyle.Font

如果我理解您的问题,这是您需要的代码:

Private Sub DetailGridViewSetStyle()
        Dim dgv As DataGridView = DetailDataGridView

        For Each row As DataGridViewRow In dgv.Rows
            Dim Value As Boolean = CBool(row.Cells(4).Value)

            If Value = False Then
                row.DefaultCellStyle.Font = New Font("ARIAL", 8, FontStyle.Strikeout)
            Else
                row.DefaultCellStyle.Font = New Font("ARIAL", 8, FontStyle.Regular)
            End If

        Next
    End Sub
于 2021-07-09T18:02:19.503 回答
0

如果您的 DataGridView 绑定到数据源,您可能希望在 DataBinding 完成后格式化网格的行。
订阅DataBindingComplete事件。

之后,您需要处理单元格值的更改,以根据当前行中列的值格式化行。
订阅CellValueChanged事件。

我正在使用辅助方法来确定当前是什么确定字体样式更改的单元格的值是什么,其 OwningRow 的当前字体是什么,然后将字体样式更改为指定的样式(如果满足所有条件) ,否则,恢复为默认字体样式。

注意:DataGridViewRow.DefaultCellStyle可能为 null,因为 Row 可能从 继承 Font DataGridView.DefaultCellStyle,所以我们需要检查DataGridViewRow.InheritedStyle的值。
在辅助方法中有一个使用合并表达式的赋值:

Dim rowFont = If(row.DefaultCellStyle.Font, row.InheritedStyle.Font)

如果此语法在您的 VB.Net 版本中不可用,请使用扩展形式:

 Dim rowFont = If(row.DefaultCellStyle.Font Is Nothing, row.InheritedStyle.Font, row.DefaultCellStyle.Font)

或者,如果当前 Cell 值为 null ( Nothing) 或为DbNull.Value ,则不执行任何操作:例如,如果将DataGridView.DataSource设置为 DataTable 则可以。
如果要将 null Cell 值解释为0,请相应地更改代码。

Private Sub DetailDataGridView_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles DetailDataGridView.CellValueChanged
    If e.ColumnIndex = 4 Then
        ToggleRowFontStyle(Of Integer)(DetailDataGridView(4, e.RowIndex), 0, FontStyle.Strikeout)
    End If
End Sub

Private Sub DetailDataGridView_DataBindingComplete(sender As Object, e As DataGridViewBindingCompleteEventArgs) Handles DetailDataGridView.DataBindingComplete
    For Each row As DataGridViewRow In DetailDataGridView.Rows
        ToggleRowFontStyle(Of Integer)(DetailDataGridView(4, row.Index), 0, FontStyle.Strikeout)
    Next
End Sub

辅助方法:

Private Sub ToggleRowFontStyle(Of T)(cell As DataGridViewCell, toggleValue As T, toggleFontStyle As FontStyle)
    If cell.Value Is Nothing OrElse cell.Value Is DBNull.Value Then Return

    Dim row As DataGridViewRow = cell.OwningRow
    Dim cellValue As T = CType(Convert.ChangeType(cell.Value, GetType(T)), T)
    Dim rowFont = If(row.DefaultCellStyle.Font, row.InheritedStyle.Font)

    If cellValue.Equals(toggleValue) Then
        If rowFont.Style <> toggleFontStyle Then
            rowFont = New Font(rowFont, toggleFontStyle)
        End If
    Else
        If rowFont.Style = toggleFontStyle Then
            rowFont = New Font(rowFont, FontStyle.Regular)
        End If
    End If
    row.DefaultCellStyle.Font = rowFont
End Sub
于 2021-07-09T20:32:08.727 回答