如果您的 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