Hallo,
seit Tagen schlage ich mich mit dem Problem herum, dass ein schick formatiertes DataGridView nach der Umsortierung durch Klick auf den Columnheader seine Formatierung vergisst.
Dazu findet man auch eine Menge im Internet, z.B. über "DataGridView lost CellStyle on Sort". Alle Tips gehen aber davon aus, dass das Styling in Abhängigkeit des Zellinhalts geschehen soll. Ich habe aber einen weiteren Wert in der Datatable, welchen ich nicht anzeigen möchte, und den Value somit überschreiben muss. Die Farbe der Zelle soll den Wert verdeutlichen. dgvtest.CellFormating event fällt also aus.
Da der Style nicht erhalten bleibt, dachte ich es wäre eine gute Idee die "Steuerinfomation" im Tag der Zelle abzulegen, ABER: die ist nach einem Sort auch leer. What nu?
Hier ein Beispiel zum schnellen Ausprobieren. Alles was Ihr braucht ist eine form mit einem datagridview Namens "dgvTest", den Rest macht der Code.
Public Class Form1
Dim dtTest As New DataTable
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles Me.Load
Try
With dtTest.Columns
.Add("Wert", GetType(System.String))
End With
With dtTest.Rows
.Add(New Object() {"Apfel#24#12"})
.Add(New Object() {"Birne#12#12"})
.Add(New Object() {"Pflaume#34#16"})
End With
With dgvTest
.DataSource = dtTest
.AutoResizeRows()
.AutoSizeRowsMode = _
DataGridViewAutoSizeRowsMode.AllCellsExceptHeaders
.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
.AllowUserToAddRows = False 'letzte (leere) Zeile verbergen
.RowHeadersVisible = False 'Zeile mit dem Pfeil vor der
' Kommunikation verbergen
.AlternatingRowsDefaultCellStyle.BackColor = Color.LemonChiffon
.SelectionMode = DataGridViewSelectionMode.FullRowSelect
.ReadOnly = True
End With
For Each row As DataGridViewRow In dgvTest.Rows
For Each cell As DataGridViewCell In row.Cells
If Not IsDBNull(cell.Value) Then
Dim strWerte() As String = cell.Value.Split("#")
If strWerte.Length = 3 Then
'Zellwert korrigieren, damit der 3. Wert entfällt
cell.Value = strWerte(0) & " " & strWerte(1)
'Farben und Tags festlegen
If CDec(strWerte(1)) < CDec(strWerte(2)) Then
cell.Style.BackColor = Color.LightGreen
cell.Tag = "LightGreen"
ElseIf CDec(strWerte(1)) = CDec(strWerte(2)) Then
cell.Style.BackColor = Color.Gold
cell.Tag = "Gold"
ElseIf CDec(strWerte(1)) > CDec(strWerte(2)) Then
cell.Style.BackColor = Color.Salmon
cell.Tag = "Salmon"
End If
End If
End If
Next
Next
Catch ex As Exception
If MessageBox.Show("Es ist ein Fehler aufgetreten." + vbLf + _
"Möchten Sie eine erweiterte Fehlermeldung?", "Provendis" & _
"Fehlerbehandlung", MessageBoxButtons.YesNo, _
MessageBoxIcon.Error) = MsgBoxResult.Yes Then MsgBox(ex.ToString)
Exit Sub
End Try
End Sub
Private Sub dgvTest_Sorted(ByVal sender As Object, ByVal e As _
System.EventArgs) Handles dgvTest.Sorted
Try
For Each row As DataGridViewRow In dgvTest.Rows
For Each cell As DataGridViewCell In row.Cells
If Not IsDBNull(cell.Value) Then
'Farben und Tags festlegen
If cell.Tag = "LightGreen" Then
cell.Style.BackColor = Color.LightGreen
ElseIf cell.Tag = "Gold" Then
cell.Style.BackColor = Color.Gold
ElseIf cell.Tag = "Salmon" Then
cell.Style.BackColor = Color.Salmon
End If
End If
Next
Next
Catch ex As Exception
If MessageBox.Show("Es ist ein Fehler aufgetreten." + vbLf + _
"Möchten Sie eine erweiterte Fehlermeldung?", "Provendis" & _
"Fehlerbehandlung", MessageBoxButtons.YesNo, _
MessageBoxIcon.Error) = MsgBoxResult.Yes Then MsgBox(ex.ToString)
Exit Sub
End Try
End Sub
End Class Hat einer eine Idee? Danke für Eure Zeit. |