Модераторы: diadiavova, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DataGridView1 CellPainting (ForeColor), Найти текст и перекрасить его(не задни) 
:(
    Опции темы
DENSHER
Дата 10.8.2014, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 3.3.2010

Репутация: нет
Всего: нет



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

Код

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


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

Это сообщение отредактировал(а) DENSHER - 11.8.2014, 03:39
PM MAIL   Вверх
~FoX~
Дата 15.8.2014, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: нет
Всего: 68



Код

 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 не нужен тебе, потому как это свойство ячейки и его можно установить единоразово...

Это сообщение отредактировал(а) ~FoX~ - 15.8.2014, 08:57


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
DENSHER
Дата 20.8.2014, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 3.3.2010

Репутация: нет
Всего: нет



Спасибо за пример и ответ.  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0424 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.