Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB .NET > DataGridView1 CellPainting (ForeColor)


Автор: DENSHER 10.8.2014, 10:07
Подскажите пожалуйста, как перекрасить текст, а не задний фон.
Очень много примеров нашел но все не то.
Вот ниже пример как найти нужный текст и закрасить у него задний фон.

Код

Private search As String
    Private Sub Form1_Load(sender As Object, _
                           e As EventArgs) Handles MyBase.Load
        search = "GREEN"
        DataGridView1.Refresh()
    End Sub

    Private Sub Button1_Click(sender As Object, _
                              e As EventArgs) Handles Button1.Click
        Dim txt As String = "07:30:23: ""  Player1<13><GREEN>"" attacked "" " & _
                                     "Player2<10><RED>"" with ""Weapon"" damage ""18"""
        DataGridView1.Rows.Add(txt)
    End Sub

    Private Sub DataGridView1_CellPainting _
        (ByVal sender As Object, _
         ByVal e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) _
        Handles DataGridView1.CellPainting

        If search = String.Empty OrElse e.ColumnIndex = -1 _
                         OrElse e.RowIndex = -1 Then Return
        Dim text As String = CStr(e.FormattedValue)
        Dim ix As Integer = text.IndexOf(search)
        If text = String.Empty OrElse ix = -1 Then Return
        Dim ranges As New List(Of CharacterRange)
        Do Until ix = -1
            ranges.Add(New CharacterRange(ix, search.Length))
            ix = text.IndexOf(search, ix + search.Length)
        Loop
        Dim strFormat As StringFormat = StringFormat.GenericTypographic
        strFormat.SetMeasurableCharacterRanges(ranges.ToArray)

        strFormat.LineAlignment = StringAlignment.Center
        strFormat.Alignment = StringAlignment.Near

        Dim selected As Boolean = _
            (e.State And DataGridViewElementStates.Selected) = _
            DataGridViewElementStates.Selected
        e.PaintBackground(e.ClipBounds, selected)
        For Each hilight As Region In e.Graphics.MeasureCharacterRanges _
            (text, e.CellStyle.Font, e.CellBounds, strFormat)
            e.Graphics.FillRegion(Brushes.Yellow, hilight)
            hilight.Dispose()
        Next
        strFormat.Dispose()
        e.PaintContent(e.ClipBounds)
        e.Paint(e.ClipBounds, DataGridViewPaintParts.Border)
        e.Handled = True
    End Sub


Мне же нужно изменить цвет текста, а не заднего фона.

Если не сложно вам, то smile

Нашел пример все вроде то что нужно, но есть одно но...
Код

Public Class Form1
    Dim mdtbColourMap As DataTable = Nothing

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        mdtbColourMap = New DataTable
        mdtbColourMap.Columns.Add(New DataColumn("SearchText", GetType(String)))
        mdtbColourMap.Columns.Add(New DataColumn("ChangeColor", GetType(Brush)))
        mdtbColourMap.Rows.Add("GREEN", Brushes.Green)
        mdtbColourMap.Rows.Add("RED", Brushes.Red)
    End Sub

    Private Sub DataGridView1_CellPainting(sender As Object, _
                                             e As DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting

        If e.RowIndex >= 0 Then
            Dim selected As Boolean = (e.State And DataGridViewElementStates.Selected) = _
                DataGridViewElementStates.Selected
            e.PaintBackground(e.ClipBounds, selected)

            If (e.Value IsNot Nothing) Then
                Dim strWords() As String = Split(e.Value, " ")
                Dim sngX As Integer = 0
                For i As Integer = 0 To strWords.GetUpperBound(0)
                    Dim brsTextColor As Brush = Nothing
                    For j As Integer = 0 To mdtbColourMap.Rows.Count - 1
                        If InStr(strWords(i), mdtbColourMap.Rows(j).Item("SearchText").ToString) > 0 Then
                            brsTextColor = DirectCast(mdtbColourMap.Rows(j).Item("ChangeColor"),  _
                                Drawing.Brush) ' изменить цвет
                            Exit For
                        End If
                    Next
                    If brsTextColor Is Nothing Then brsTextColor = Brushes.Black ' стандартный цвет

                    e.Graphics.DrawString(strWords(i), e.CellStyle.Font, brsTextColor, sngX, _
                                          e.CellBounds.Y + 2, StringFormat.GenericDefault)
                    sngX += e.Graphics.MeasureString(strWords(i), e.CellStyle.Font).Width
                Next i
            End If
            e.Handled = True
        End If
    End Sub

    Dim txt As String = "07:30:23: ""  Player1<13><GREEN>"" attacked "" " & _
                                     "Player2<10><RED>"" with ""Weapon"" damage ""18"""

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        For i As Integer = 0 To 25
            DataGridView1.Rows.Add(txt)
        Next
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        DataGridView1.Rows.Add(txt)
    End Sub
End Class


Идет мерцание при добавлении и при клике в колонки. Колонка всего одна.
Может можно как-то оптимизировать код, чтобы не было мерцания?

Автор: ~FoX~ 15.8.2014, 08:55
Код

 Private Sub DataGridView1_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting
        If (e.FormattedValue = "RED") Then
            e.CellStyle.ForeColor = Color.Red
        ElseIf (e.FormattedValue = "GREEN") Then
            e.CellStyle.ForeColor = Color.Green
        End If
    End Sub

Но по мне так CellPainting не нужен тебе, потому как это свойство ячейки и его можно установить единоразово...

Автор: DENSHER 20.8.2014, 09:40
Спасибо за пример и ответ.  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)