DataGridView Row ForeColor не меняется - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть метод, который проходит по каждой строке в моем DataGridView и назначает требуемый ForeColor, однако я не уверен, почему мой DataGridView не принимает эти стили?Вот код, который обрабатывает это

Private Shared Sub dgvRowFormatting(dgv As DataGridView) 
    For Each row As DataGridViewRow In dgv.Rows            
        row.DefaultCellStyle.ForeColor = lColor
    Next
End Sub

Я передаю метод, как только присваиваю BindingSource для DataGridView DataSource следующим образом:

bindingSource.DataSource = customerList
dgv.DataSource = bindingSource
dgvRowFormatting(dgv)

Я не совсем уверен, что ячто-то упустил?

Ответы [ 3 ]

0 голосов
/ 14 ноября 2018

Конечно, вы можете делать это другими способами (см. Сообщения @ Jimi's или @ TnTinMn).

Но ваш код работает нормально.Единственное, что нужно изменить - lColor на правильный цвет, например: Color.Red

Перед запуском убедитесь, что у вас есть некоторые данные, заполненные вdatagridview.

Вы должны увидеть красный текст в виде сетки.

Private Shared Sub dgvRowFormatting(dgv As DataGridView)
    For Each row As DataGridViewRow In dgv.Rows
        row.DefaultCellStyle.ForeColor = Color.Red
    Next
End Sub

РЕДАКТИРОВАТЬ: 2018-11-14 17: 45

Конечно, весь текст красный.Обратите внимание, что мы не знаем ваших условий для изменения цвета.

Вот вам пример того, как ваш код меняет цвет в зависимости от значения идентификатора столбца:

Private Shared Sub dgvRowFormatting(dgv As DataGridView)
    For Each row As DataGridViewRow In dgv.Rows
        Select Case row.Cells("Id").Value
            Case 1, 2
                row.DefaultCellStyle.ForeColor = Color.Red
            Case 3, 4
                row.DefaultCellStyle.ForeColor = Color.Blue
            Case Else
                row.DefaultCellStyle.ForeColor = Color.Green
        End Select
    Next
End Sub
0 голосов
/ 14 ноября 2018

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

Лучше использовать CellFormatting Event для выполнения этой настройки.

Для демонстрации ниже приведен простой пример, который условно устанавливает ForeColor на основе индекса четной / нечетной строки.

Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
    If (e.RowIndex And 1) = 1 Then
        e.CellStyle.ForeColor = Color.Red ' odd numbered row
    Else
        e.CellStyle.ForeColor = Color.Black ' even numbered rows
    End If
End Sub

Обратите внимание, что этот пример также может быть выполнен с использованием свойства DataGridView.AlternatingRowsDefaultCellStyle , если условие состоит только из чередующихся строк.

Дополнительные сведения см. В: Рекомендации по масштабированию элемента управления DataGridView в Windows Forms .

0 голосов
/ 14 ноября 2018

Вам просто нужно изменить RowsDefaultCellStyle , до или после установки DataSource.
Нет необходимости устанавливать DefaultCellStyle каждой строки:

dgv.DataSource = bindingSource
dgv.RowsDefaultCellStyle.ForeColor = lColor

Если вы хотите установить эти значения для чередующихся строк, используйте свойство AlternatingRowsDefaultCellStyle :

dgv.DataSource = bindingSource
dgv.AlternatingRowsDefaultCellStyle.ForeColor = lColor

Если вы хотите изменить все ячейки строк на другие ForeColor в зависимости от некоторых условий, вам нужно где-то указать эти условия.

Пример условного установщика для свойства Color :
Пользовательский класс сравнения, используемый для изменения ForeColor из Cells каждого Row на другое значение, основанное на некоторых предварительно определенных условиях: a ([Column], [Row]).Value меньше / равно / больше нуля.

Private Shared Sub dgvRowFormatting(dgv As DataGridView)
    For Each row As DataGridViewRow In dgv.Rows
        Dim CompareValue = Convert.ToInt32(dgv(1, row.Index).Value)
        row.DefaultCellStyle.ForeColor = MyConditions.SetCondition(CompareValue)
    Next
End Sub

Public Class MyConditions
    Public Enum Condition
        LessThanZero = -1
        EqualToZero
        GreaterThanZero
    End Enum

    Public Shared Function SetCondition(Of T As IComparable)(ByVal Value As T) As Color
        Return SetColorOnCondition(CType(Value.CompareTo(0), Condition))
    End Function

    Private Shared Function SetColorOnCondition(Comparison As Condition) As Color
        Select Case Comparison
            Case Condition.LessThanZero
                Return Color.Red
            Case Condition.EqualToZero
                Return Color.Black
            Case Condition.GreaterThanZero
                Return Color.Green
        End Select
    End Function
End Class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...