更改 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 个像素。
如果满足特定条件,我想将 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 个像素。