Start / Tipps / VB.NET-Tipp 0108: Datagridview colorieren
 
Startseite Up-/Download Tutorials Club Das Team
Rubriken Foren Bücher Tips 'n Tricks Suche


VB.NET-Tipp 0108: Datagridview colorieren


Gelegentlich würde man gerne Datensätze in Abhängigkeit der Daten farblich hervorheben. Sehr schnell ist hier das RowPrePaint-Ereignis, welches nicht für alle Zeilen des Grids aufgerufen wird, sondern nur für die sichtbaren.

Schwierigkeitsgrad 1 .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5 Visual Basic 2005, Visual Basic 2008
Download des Beispielprojektes Download des Beispielprojektes [19,29 KB]
 
' Dieser Quellcode stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!

' Projektversion:   Visual Studio 2005
' Option Strict:    An
'
' Referenzen: 
'  - System
'  - System.Data
'  - System.Drawing
'  - System.Web.Services
'  - System.Windows.Forms
'  - System.Xml
'
' Imports: 
'  - Microsoft.VisualBasic
'  - Microsoft.VisualBasic.ControlChars
'  - System
'  - System.Collections
'  - System.Collections.Generic
'  - System.Data
'  - System.Drawing
'  - System.Diagnostics
'  - System.Windows.Forms
'

' ##############################################################################
' ############################# frmColoredGrid.vb ##############################
' ##############################################################################
Imports ColoredGrid.MeasureDataSet

Public Class frmColoredGrid

    Private Sub MenuItem_Click(ByVal sender As Object, ByVal e As EventArgs) _
        Handles SaveToolStripMenuItem.Click, ReLoadToolStripMenuItem.Click, _
        RandomMeasureToolStripMenuItem.Click

        Select Case True
            Case sender Is RandomMeasureToolStripMenuItem
                Dim T As DateTime = GetRow(Of MeasureRow)( _
                    MeasureBindingSource( _
                        MeasureBindingSource.Count - 1)).TimeStamp
                Dim Rnd As New Random(Environment.TickCount)
                For I As Integer = 0 To 19
                    T += TimeSpan.FromSeconds(50)
                    Me.MeasureDataSet.Measure.AddMeasureRow(Rnd.Next(0, 100), T)
                Next

            Case sender Is ReLoadToolStripMenuItem
                ' Zu beachten: Da dem TU kein DatenFile beiliegt, muß erst 
                '  eines mit "Save" erstellt werden, bevor es geladen werden 
                '  kann
                Me.MeasureDataSet.Clear()
                Me.MeasureDataSet.ReadXml("Measure.Dataset")

            Case sender Is SaveToolStripMenuItem
                ' EndEdit() bewirkt die Übernahme der aktuellen Zeile in die 
                '  Datasource. Andernfalls würden die letzten Änderungen nicht 
                '  mit abgespeichert, da Änderungen erst beim Wechsel der Zeile 
                '  in die DataSource rückgeschrieben werden 
                Me.MeasureDataGridView.EndEdit()
                Me.MeasureBindingSource.EndEdit()
                Me.MeasureDataSet.WriteXml("Measure.Dataset")

        End Select
    End Sub

    Private Sub MeasureDataGridView_RowPrePaint(ByVal sender As Object, _
        ByVal e As DataGridViewRowPrePaintEventArgs) _
        Handles MeasureDataGridView.RowPrePaint

        If e.RowIndex < 0 OrElse _
            e.RowIndex >= MeasureBindingSource.Count Then Return
        Dim Rw As DataGridViewRow = Me.MeasureDataGridView.Rows(e.RowIndex)
        Dim Col As Color

        Select Case GetRow(Of MeasureRow) _
            (MeasureBindingSource(e.RowIndex)).Temperature

            Case Is < 15
                Col = Color.LightBlue
            Case Is < 70
                Col = Color.LightGreen
            Case Is < 85
                Col = Color.Orange
            Case Else
                Col = Color.OrangeRed
        End Select

        If Not AssignSave(Rw.DefaultCellStyle.BackColor, Col) Then Return
        ' SelectionBackColor dunkler tönen
        Col = Color.FromArgb((Col.R * 2) \ 3, (Col.G * 2) \ 3, (Col.B * 2) \ 3)
        AssignSave(Rw.DefaultCellStyle.SelectionBackColor, Col)
    End Sub

End Class

' ##############################################################################
' ################################ Helpers.vb ##################################
' ##############################################################################
Public Module Helpers

    ''' <summary>
    ''' Casts, um aus einem untypisiertem DataRowView die typisierte 
    '''  Row zu ermitteln
    ''' </summary>
    Public Function GetRow(Of T As DataRow)(ByVal Current As Object) As T
        Return DirectCast(DirectCast(Current, DataRowView).Row, T)
    End Function

    ''' <summary>
    ''' Überprüft vor einer Zuweisung, ob der neue Wert auch eine Änderung 
    '''  bedeutet
    ''' </summary>
    Public Function AssignSave(Of T, T2 As T)(ByRef Dest As T, _
        ByVal Src As T2) As Boolean

        If Object.Equals(Dest, Src) Then Return False
        Dest = Src
        Return True
    End Function

End Module

Ihre Meinung

Falls Sie Fragen zu oder Erfahrungen mit diesem Tipp haben, dann sollten Sie diese hier posten. Für alles weitere melden Sie sich bitte in einem zum Thema passendem Forum.

Falls Sie in ihren Kommentar Quellcode einbinden wollen, verwenden Sie bitte Pseudotags: Quellcode Bei VB.NET wird durch ein vorangestelltes [dotnet] markiert und durch [/dotnet] abgeschlossen.

Ihr Name:   
Ihre E-Mailadresse:   
 
Bitte folgende Kontrollnummer eingeben: 513
Kontrolle:   
 
Ihre Frage/Ihr Kommentar:
Ja, ich möchte weitere Beiträge per E-Mail erhalten
Von ActiveVB-Notizservice am 01.01.2002 um 00:01
Bisher wurden noch keine Notizen zu dieser Seite gepostet.

Erstellt: 19.02.2009
Aktualisierung: 26.07.2010
  Autor: Spatzenkanonier
E-Mail: Tipps@ActiveVB.de



Copyright © 1998-2010 by ActiveVB
Alle Rechte vorbehalten.