Подскажите пожалуйста, как перекрасить текст, а не задний фон. Очень много примеров нашел но все не то. Вот ниже пример как найти нужный текст и закрасить у него задний фон. | Код | 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
|
Мне же нужно изменить цвет текста, а не заднего фона. Если не сложно вам, то  Нашел пример все вроде то что нужно, но есть одно но... | Код | 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
|
Идет мерцание при добавлении и при клике в колонки. Колонка всего одна. Может можно как-то оптимизировать код, чтобы не было мерцания? Это сообщение отредактировал(а) DENSHER - 11.8.2014, 03:39
|