Обвод контуром DataGridViewRow - Visual Basic .NET

Формулировка задачи:

Привет всем! Подскажите, пожалуйста, каким образом сделать так, чтобы вся активная строка моей DataGridView обводилась контуром выбранного цвета, а после того, как эта строка становилась неактивной, это обведение исчезало? С отдельной ячейкой понятно, использую CellPainting, но вот как всю активную строку обводить? Спасибо!Добавлено через 12 часов 35 минутРешил задачку. Кому интересно, вот код на VB:
    Dim SelectionBackColor, SelectionBorderColor As Color
    Dim FirstVisibleColumnName, LastVisibleColumnName As String
 
    ' функция установки яркости (Value) исходного цвета (Color)
 
    Public Function Brightness(ByVal Color As Color, ByVal Value As Short) As Color
 
        Dim c As Integer = Value
 
        Dim r As Integer = Color.R + c
        Dim g As Integer = Color.G + c
        Dim b As Integer = Color.B + c
 
        If r > 255 Then r = 255
        If g > 255 Then g = 255
        If b > 255 Then b = 255
 
        If r < 0 Then r = 0
        If g < 0 Then g = 0
        If b < 0 Then b = 0
 
        Return Color.FromArgb(r, g, b)
 
    End Function
 
    Private Sub SetColumnsSettings()
 
        With DataGridView1
 
            ' установка цветов
 
            SelectionBackColor = Color.FromArgb(204, 232, 255)
            SelectionBorderColor = Brightness(SelectionBackColor, -40)
 
            .DefaultCellStyle.SelectionBackColor = SelectionBackColor
 
            ' нахождение первой и последней видимой в DataGridView колонок
 
            Dim p As Boolean = True
 
            For Each c As DataGridViewColumn In .Columns
                If c.Visible Then
                    If p Then FirstVisibleColumnName = c.Name : p = False Else LastVisibleColumnName = c.Name
                End If
            Next
 
        End With
 
    End Sub
 
    Private Sub DataGridView1_VisibleChanged(sender As Object, e As EventArgs) Handles DataGridView1.VisibleChanged
        If DataGridView1.Visible Then SetColumnsSettings()
    End Sub
 
    Private Sub DataGridView1_SelectionChanged(sender As Object, e As EventArgs) Handles DataGridView1.SelectionChanged
        DataGridView1.Invalidate()
    End Sub
 
    Private Sub DataGridView1_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting
 
        If e.RowIndex = DataGridView1.CurrentCell.RowIndex Then
 
            Dim b As Rectangle = DataGridView1.GetRowDisplayRectangle(e.RowIndex, False)
 
            Dim bl As Rectangle = DataGridView1.GetColumnDisplayRectangle(DataGridView1.Columns(LastVisibleColumnName).Index, False)
 
            Dim w As Integer = bl.Left + bl.Width - 1
 
            If w < 0 Then w = b.Left + b.Width
 
            b = New Rectangle(b.X, b.Y, w, b.Height - 1)
 
            e.Paint(b, DataGridViewPaintParts.All Or DataGridViewPaintParts.Border)
 
            Using p As New Pen(SelectionBorderColor, 1)
                e.Graphics.DrawRectangle(p, b)
            End Using
 
            e.Handled = True
 
        End If
 
    End Sub
Cвойство SelectionMode вашей DataGridView должно быть установлено в FullRowSelect

Код к задаче: «Обвод контуром DataGridViewRow - Visual Basic .NET»

textual
Private Sub DataGridView1_SelectionChanged(sender As System.Object, e As System.EventArgs) Handles DataGridView1.SelectionChanged
    DataGridView1.Invalidate()
End Sub
Private Sub DataGridView1_RowPostPaint(sender As System.Object, e As System.Windows.Forms.DataGridViewRowPostPaintEventArgs) Handles DataGridView1.RowPostPaint
    If (e.State And DataGridViewElementStates.Selected) = DataGridViewElementStates.Selected Then
        Dim rowBounds As Rectangle = DataGridView1.GetRowDisplayRectangle(e.RowIndex, True)
        Dim pn As Pen = New Pen(Brushes.Red, 2)
        Try
            e.Graphics.DrawRectangle(pn, rowBounds)
        Finally
            pn.Dispose()
        End Try
    End If
End Sub

9   голосов, оценка 3.444 из 5


СОХРАНИТЬ ССЫЛКУ
Похожие ответы
Для поиска решения или похожих решений вы можете воспользоваться "Поиском по сайту" или "Поиском по разделу"
Поиск по сайту