VB.NET-Tipp 0108: Datagridview colorieren
von Spatzenkanonier
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: | 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: |
' 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.