Установка цвета фона в DataGridViewCells в зависимости от значения из SQL (винформы VB.Net)

Как следует из названия.

Я собираю кучу значений из базы данных SQL Compact и помещаю их в DataGridView. Одна ячейка (в данном случае «Статус») содержит поле varchar. Я хочу установить цвет фона этого поля в зависимости от его значения. Например, если это значение == "5" или "V", я хочу, чтобы оно было красным, если это "4" или "B", я хочу, чтобы оно было зеленым или что-то в этом роде.

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

Я собираю значения примерно так:

Dim Source as Bindingsource = GetBinding()
Form1.ClientsDataGrid.Columns("CustomerNr").DataPropertyName = "CustNR"
Form1.ClientsDataGrid.Columns("CustomerName").DataPropertyName = "Name"
Form1.ClientsDataGrid.Columns("Status").DataPropertyName = "Status"
Form1.ClientsDataGrid.DataSource = Source

'Just in case, this is how i set the colors now
For Each TblRow As DataGridViewRow In Form1.ClientsDataGrid.Rows
   If TblRow.Cells(3).Value.ToString = "5" Or TblRow.Cells(3).Value.ToString = "V" Then
       TblRow.Cells(3).Style.BackColor = Color.Red
   ElseIf (TblRow.Cells(3).Value.ToString = "4" Or TblRow.Cells(3).Value.ToString = "B" Then
        TblRow.Cells(3).Style.BackColor = Color.Green
    End If
Next

и GetBinding() выглядит примерно так:

'blah blah make connections
Dim Com As New SqlCeCommand("SELECT Customernumber AS CustNR, Customername AS Name, Customerstatus AS Status FROM Mytable", Con)
Dim dataAdapter As SqlCeDataAdapter
dataAdapter = New SqlCeDataAdapter(Com)
Dim dataSet As New DataSet
dataAdapter.Fill(dataSet, "Mytable")
Dim bind As BindingSource
bind = New BindingSource(dataSet, "Mytable")
Con.Close()
Com = Nothing
Return bind

Есть ли способ установить эти правила непосредственно в DataGridView? Я могу, конечно, зацикливаться каждый раз, когда я сортирую список, но это неправильно?


person gubbfett    schedule 04.06.2013    source источник


Ответы (1)


Сделайте это в событии rowprepaint.. примените к строке..

Private Sub ClientsDataGrid_RowPrePaint(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowPrePaintEventArgs) Handles ClientsDataGrid.RowPrePaint

    Dim tblRow as DataGridViewRow = ClientsDataGrid.Rows(e.RowIndex)

    If (TblRow.Cells(3).Value.ToString = "5" Or TblRow.Cells(3).Value.ToString = "V" Then

        tblRow.DefaultCellStyle.BackColor = Color.Red

    ElseIf (TblRow.Cells(3).Value.ToString = "4" Or TblRow.Cells(3).Value.ToString = "B" Then

        tblRow.DefaultCellStyle.BackColor = Color.Green

    End If

End Sub
person matzone    schedule 04.06.2013
comment
Что ты имеешь в виду? В этом коде вы забыли цикл, или я просто не понял, как вы думали? TblRow в этом случае ничего не устанавливает. Есть ли способ сказать больше, как If MyDatagrid.Cells (3), и здесь проверить весь столбец без цикла? - person gubbfett; 04.06.2013