Die Community zu .NET und Classic VB.
Menü

VB.NET-Tipp 0108: Datagridview colorieren

 von 

Beschreibung

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:

Schwierigkeitsgrad 1

Framework-Version(en):

.NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5

.NET-Version(en):

Visual Basic 2005, Visual Basic 2008

Download:

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 diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Measure Row - Asgard 07.08.12 11:20 5 Antworten