我有一些datagridview,列出了mysql数据库中的不同位和bob。
其中一个人有一个名为“结果”的专栏。
这可以是'是','待定'或'否'。
我需要根据该值格式化此列表。
我现在正在使用以下内容......
Private Sub nb_myleads_dgv_CellFormattin(ByVal sender As Object, ByVal e As DataGridViewCellFormattingEventArgs) Handles nb_myleads_dgv.CellFormatting
If e.ColumnIndex = nb_myleads_dgv.Columns("outcome").Index Then
If e.Value.ToString = "Yes" Then
nb_myleads_dgv.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.DarkGreen
ElseIf e.Value.ToString = "Pending" Then
nb_myleads_dgv.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.DarkOrange
ElseIf e.Value.ToString = "No" Then
nb_myleads_dgv.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.DarkRed
End If
End sub
End If
似乎我必须在DGV中显示我的列'结果'才能使其工作。 通过将此列宽设置为3像素,我已经解决了这个问题,但这看起来有点脏。是否无法根据隐藏列的值格式化datagridview中的单元格?
提前致谢
答案 0 :(得分:0)
我相信你的问题是细胞必须是可见的,否则它永远不会传递if语句。
每次单元格被绘制时都会发生CellFormatting事件,因此 处理此事件时应避免冗长处理。这个 当检索到FormattedValue单元格或其时,也会发生事件 调用GetFormattedValue方法。
我会摆脱这个if语句并做这样的事情:
Dim str as string = dataGridView1.Rows[e.RowIndex].Cells["outcome"].Value.ToString
If str = "Yes" Then
nb_myleads_dgv.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.DarkGreen
ElseIf str = "Pending" Then
nb_myleads_dgv.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.DarkOrange
ElseIf str = "No" Then
nb_myleads_dgv.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.DarkRed
End If
答案 1 :(得分:0)
为什么不循环遍历带有for的行,并根据单元格值进行着色。它是否可见无关紧要。
For Each row As DataGridViewRow In DataGridView1.Rows
If Not row.IsNewRow Then
Select Case row.Cells(2).Value.ToString
Case "Yes"
row.DefaultCellStyle.BackColor = Color.DarkGreen
Case "Pending"
row.DefaultCellStyle.BackColor = Color.DarkOrange
Case "No"
row.DefaultCellStyle.BackColor = Color.DarkRed
End Select
End If
Next
在这种情况下,第3列(单元格(2)被隐藏。您可以在填充网格后而不是在单元格格式中执行此操作