Вы можете обрабатывать события RowPostPaint или RowPrePaint , чтобы нарисовать границу одной или нескольких строк на основе определенных условий c.
Здесь я использую обработчик событий RowPostPaint
, поскольку в DataGridView, возможно, уже есть какая-то процедура рисования: RowPostPaint
позволяет закрашивать уже нарисованную строку, переопределяя некоторые детали. Свойство e.Handled
не устанавливается, поскольку на этом этапе рисование уже было выполнено.
Свойство Handled
используется, чтобы указать, полностью ли обработчик события обработал событие или система должна завершить процесс.
- Как обычно ограничивающий прямоугольник необходимо отрегулировать, так как GDI + dr aws этой формы.
- Вы, вероятно, не хотите выделять заголовок строки, который включен в значение
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()
. Мера ограничивающего прямоугольника ячейки немного отличается, адаптируется к тому, как окрашиваются внутренние границы ячейки, поэтому новая граница перекрывает границу по умолчанию.
Мы также установили 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
Это рендеринг с текущими значениями:

Если вы предпочитаете рисовать границу внутри ячеек ' границы (или используйте более толстое перо), переместите влево / вверх на 1 пиксель и уменьшите высоту на 1 пиксель.