更改 DataGridViewRow 的轮廓

Changing the outline of a DataGridViewRow

如果满足特定条件,我想将 DataGridViewRow 的轮廓更改为蓝色以使其突出。我知道它不是 BackColor 因为它改变了行的背景颜色。我试图将 ForeColor 更改为蓝色,但没有任何变化。我不相信这是选择样式,因为这种行为不是我想要的。有什么建议可以实现这种行为吗?

item 下面是一个 DataGridViewRow。

item.DefaultCellStyle.ForeColor = Color.Blue
item.DefaultCellStyle.BackColor = Color.Blue

感谢几米的帮助

我添加到我的 datagridview.Paint

Dim visibleColumsWidth As Integer = dataGridView.Columns.GetColumnsWidth(DataGridViewElementStates.Visible)
Dim y As Integer = dataGridView.GetCellDisplayRectangle(Column.DisplayIndex, rowIndex, True).Top
Dim rect As New Rectangle(dataGridView.RowHeadersWidth, y, visibleColumsWidth, item.Height - 1)
e.Graphics.DrawRectangle(Pens.Blue, rect)

您可以根据特定条件处理 RowPostPaint or RowPrePaint 事件来绘制一个或多个行的边框。

在这里,我使用 RowPostPaint 事件处理程序,因为您的 DataGridView 中可能已经有一些绘画过程:RowPostPaint 允许绘画在已经绘制的行上,重新定义一些细节。没有e.Handled属性设置,因为此时已经绘制完成了。

Handled属性用于指定事件处理程序是否已完全处理事件或系统是否应完成处理。

  • 像往常一样,由于 GDI+ 绘制此形状的方式,需要调整边界矩形。
  • 您可能不想勾勒 Header 行的轮廓,它包含在 e.RowBounds 值中,因此我们需要减去 DataGridView.RowHeadersWidth 来自 e.RowBounds.Width
  • 轮廓应该只应用于可见的列,因此我们可以使用 DataGridView.Columns.GetColumnsWidth() 方法来获取此度量,指定 DataGridViewElementStates.Visible 作为列状态。

► 将 [Some Condition] 替换为应在您的上下文中生成大纲的条件。

Private Sub dataGridView1_RowPostPaint(sender As Object, e As DataGridViewRowPostPaintEventArgs) Handles DataGridView1.RowPostPaint
    If [Some Condition] Then
        Dim visibleColumsWidth As Integer = dataGridView1.Columns.GetColumnsWidth(DataGridViewElementStates.Visible)
        Dim rect = New Rectangle(dataGridView1.RowHeadersWidth, e.RowBounds.Top - 1, visibleColumsWidth, e.RowBounds.Height)
        e.Graphics.DrawRectangle(Pens.Blue, rect)
    End If
End Sub

如果您想绘制单个单元格的轮廓,则处理 CellPainting 事件:

在这里,我们使用 e.Graphics.DrawRectangle() 方法绘制除 覆盖 单元格边框默认绘制之外的所有部分。 Cell bounding rectangle measure 略有不同,适用于单元格内部边框的绘制方式,因此新边框与默认边框重叠。

我们还设置了e.Handled = True,以通知绘图已被处理,无需执行任何其他操作。

Private Sub dataGridView1_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting
    If e.RowIndex < 0 OrElse e.ColumnIndex < 0 Then Return
    If [Some Condition] Then
        Dim rect = New Rectangle(e.CellBounds.X - 1, e.CellBounds.Y - 1, e.CellBounds.Width, e.CellBounds.Height)
        e.PaintBackground(e.CellBounds, True)
        e.PaintContent(e.CellBounds)
        e.Graphics.DrawRectangle(Pens.Red, rect)
        e.Handled = True
    End If
End Sub

这是当前值的渲染:

如果您更喜欢在单元格边界内绘制边框(或使用较粗的笔),请将 Left/Top 向下移动 1 个像素并将高度缩短 1 个像素。