Изменение структуры DataGridViewRow - PullRequest
1 голос
/ 08 апреля 2020

Если определенное условие выполнено, я хочу изменить контур DataGridViewRow на синий, чтобы выделить его. Я знаю, что это не BackColor, поскольку он меняет цвет фона строки. Я попытался изменить ForeColor на синий, но ничего не изменилось. Я бы не поверил, что это стили выбора, так как это поведение не то, что я ищу. Любые предложения, чтобы получить такое поведение?

item ниже является DataGridViewRow.

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

Благодаря помощи от Jimi.

Я добавил в свой 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)

1 Ответ

2 голосов
/ 08 апреля 2020

Вы можете обрабатывать события 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

Это рендеринг с текущими значениями:

DataGridView RowPostPaint CellPainting

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

...