vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Mails senden, abrufen und decodieren - ganz easy ;-)  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2020
 
zurück
Rubrik: Controls · MSFlexGrid/DataGrid   |   VB-Versionen: VB5, VB616.10.06
FlexGrid einfärben

Dieser Tipp stellt Ihnen Funktionen zur Verfügung mit deren Anwendung Sie die Zeilen des Flexgrids in Abhängigkeit von den Werten einer "Schlüsselspalte" färben können.

Autor:   Dietrich HerrmannBewertung:     [ Jetzt bewerten ]Views:  12.309 
ohne HomepageSystem:  Win9x, WinNT, Win2k, WinXP, Vista, Win7, Win8, Win10 Beispielprojekt auf CD 

Für das alternierende "Einfärben" von FlexGrid-Zeilen haben Sie sicher schon Lösungen gesehen. Dieser Tipp stellt Ihnen Funktionen zur Verfügung mit deren Anwendung Sie die Zeilen des Flexgrids in Abhängigkeit von den Werten einer "Schlüsselspalte" färben können. D.h., ändert sich der Wert in einem Tabellenfeld der Schlüsselspalte, wird die Zeile anders gefärbt; alle Zeilen mit dem gleichen Schlüsselwert erhalten die gleiche Farbe.

Als erstes muss dafür ein Feld erstellt werden, das die Werte der Schlüsselspalte enthält, und zwar jeden Wert nur einmal. Folgende Funktion erstellt das Feld:

' Erzeugen eines Feldes mit den Werten einer FlexGrid-Spalte
' flGrid- das Flexgrid, das bearbeitet werden soll
' arrayCol- die Schlüsselspalte
'-----------------------------------------------------------
Public Function makeArrayFromCol(flGrid As MSFlexGrid, arrayCol As Long)
  Dim i&, idx&
  Dim feld() As String
  With flGrid
  ReDim feld(.Rows - .FixedRows - 1)
    idx = 0
    For i = .FixedRows To .Rows - 1
      feld(idx) = .TextMatrix(i, arrayCol)
      idx = idx + 1
    Next i
  End With
  QuickSort feld, LBound(feld), UBound(feld)
  feld = RemoveDoubleValues(feld)
  makeArrayFromCol = feld
End Function

Sie sehen, dass hier die Funktion QuickSort zum Sortieren des Feldes (Tipp:  QuickSort in VB), als auch die Funktion RemoveDoubleValues zum Beseitigen von doppelten Einträgen benutzt wird (Tipp:  Andys VisualBasic Tipps).

Als nächstes benötigt man ein zu dem eben erzeugten Werte-Feld ein "Parallel-Feld", das dem jeweiligen Schlüsselwert einen Farbwert für den Zeilenhintergrund zuordnet.
Ich habe dafür zwei Funktionen geschrieben. Die erste erzeugt unter Benutzung der zweiten ein "korrespondierendes" Feld mit Farbwerten für die Zeilenhintergründe.

Wichtig: das Feld "farbPalette" muss als Public vereinbart werden.

' Erzeugen eines Feldes von Farbcodes
' anzElements- Anzahl der benötigten Feldelemente
' (in unserem Fall Ubound(des Wertefelds)
' param- ein Index für die Farbpalettenauswahl
' (siehe Bsp. In der Funktion setPalette)
Public Function subArrayColors(anzElements As Integer, param As Integer)
  Dim feld() As Long
  Dim i%
  setPalette param
  ReDim feld(anzElements)
  For i = 0 To anzElements
    feld(i) = farbPalette(i)
  Next i
  subArrayColors = feld
End Function

Die folgende Funktion erzeugt das Feld "farbPalette". Ich habe dazu ein Modul, in dem ich mehrere Farbpaletten als Enumerationen gespeichert habe. Für diesen Tipp zeige ich nur eine Möglichkeit, und zwar mit der VB-Palette.

' Setzen der Long-Werte der Farbpalette
' art- Index einer auszuwählenden Farbpalette
Public Sub setPalette(art As Integer)
  Select Case art
    ' .................................
    Case 2
    farbPalette = Array( _
      palColor1, palColor2, palColor3, palColor4, palColor5, palColor6, _
      palColor7, palColor8, palColor9, palColor10, palColor11, palColor12, _
      palColor13, palColor14, palColor15, palColor16, palColor17, palColor18, _
      palColor19, palColor20, palColor21, palColor22, palColor23, palColor24, _
      palColor25, palColor26, palColor27, palColor28, palColor29, palColor30, _
      palColor31, palColor32, palColor33, palColor34, palColor35, palColor36, _
      palColor37, palColor38, palColor39, palColor40, palColor41, palColor42, _
      palColor43, palColor44, palColor45, palColor46, palColor47, palColor48)
    ' .................................
  End Select
End Sub

Und die zugehörige Enumeration:

Dim farbPakette As Variant
 
Public Enum paletteColors
  palColor1 = &HFFFFFF
  palColor2 = &HC0C0FF
  palColor3 = &HC0E0FF
  palColor4 = &HC0FFFF
  palColor5 = &HC0FFC0
  palColor6 = &HFFFFC0
  palColor7 = &HFFC0C0
  palColor8 = &HFFC0FF
 
  palColor9 = &HE0E0E0
  palColor10 = &H8080FF
  palColor11 = &H80C0FF
  palColor12 = &H80FFFF
  palColor13 = &H80FF80
  palColor14 = &HFFFF80
  palColor15 = &HFF8080
  palColor16 = &HFF80FF
 
  palColor17 = &HC0C0C0
  palColor18 = &HFF&
  palColor19 = &H80FF&
  palColor20 = &HFFFF&
  palColor21 = &HFF00&
  palColor22 = &HFFFF00
  palColor23 = &HFF0000
  palColor24 = &HFF00FF
 
  palColor25 = &H808080
  palColor26 = &HC0&
  palColor27 = &H40C0&
  palColor28 = &HC0C0&
  palColor29 = &HC000&
  palColor30 = &HC0C000
  palColor31 = &HC00000
  palColor32 = &HC000C0
 
  palColor33 = &H404040
  palColor34 = &H80&
  palColor35 = &H4080&
  palColor36 = &H8080&
  palColor37 = &H8000&
  palColor38 = &H808000
  palColor39 = &H800000
  palColor40 = &H800080
 
  palColor41 = &H0&
  palColor42 = &H40&
  palColor43 = &H404080
  palColor44 = &H4040&
  palColor45 = &H4000&
  palColor46 = &H404000
  palColor47 = &H400000
  palColor48 = &H400040
End Enum

Sind beide Felder erstellt, kann das Flexgrid mit der folgenden Funktion farbig erstellt werden:

' Erzeugen gefärbter Zeilen anhand von Werten in einer Spalte
'---------------------------------------------------------------
' flGrid- das FlexGrid,
' compCol- die Spalte mit den Vergleichswerten,
' werteFeld- ein Feld mit den Vergleichswerten,
' colorFeld- ein Feld mit den Farbwerten,
' defaultColor- die Normalfarbe
' compMethod- die Vergleichsmethode („all“- ganzer Wert, „in“- Teil des Werts)
Public Sub coloredOfValue(flGrid As MSFlexGrid, _
  compCol As Long, _
  werteFeld As Variant, _
  colorFeld As Variant, _
  defaultColor As Long, _
  compMethod As String)
 
  Dim i&, j&, cColor, fColor
 
  With flGrid
    .Redraw = False
    .BackColor = defaultColor
    .FillStyle = flexFillRepeat
    For i = .FixedRows To .Rows - 1
      cColor = defaultColor
      .Row = i
      For j = 0 To UBound(werteFeld)
        If compMethod = "all" Then
          If werteFeld(j) = .TextMatrix(.Row, compCol) Then
            cColor = colorFeld(j)
          End If
        Else
          If InStr(.TextMatrix(.Row, compCol), werteFeld(j)) > 0 Then
            cColor = colorFeld(j)
          End If
        End If
      Next j
      .Col = .FixedCols
      .ColSel = .Cols - 1
      .CellBackColor = cColor
      fColor = GegenFarbe_sw(cColor)
      .CellForeColor = fColor
    Next i
    .FillStyle = flexFillSingle
    .ScrollTrack = True
    .Redraw = True
  End With
End Sub

Diese Funktion enthält eine weitere Funktion:
GegenFarbe_sw, die dem Tipp  Klare Textfarbe bei variabler Hintergrundfarbe entnommen wurde. Sie gewährleistet, dass die Vordergrundfarbe der Zeile immer gut auf dem Hintergrund lesbar bleibt.

Nun zeige ich nur noch, wie die Aufrufe aussehen könnten, die Sie immer dann ausführen sollten, wenn das Flexgrid geladen oder verändert wird.

Dim keyFeld() As String
Dim farbFeld() As Long
 
keyFeld = makeArrayFromCol(MSFlexgrid1, 1)
' ....2- param für dieses Beispiel im Tipp
farbFeld = subArrayColors(UBound(keyFeld), 2)
coloredOfValue MSFlexgrid1, 1, keyFeld, farbFeld, palColor1, "all"

Wichtig zu sagen ist, dass die hier als Beispiel gezeigte Palette nur 48 Farben beinhaltet. Sind in Ihrer Anwendung wesentlich mehr unterschiedliche Schlüsselwerte zu erwarten, müssen Sie die Funktion zum Erzeugen der Farbpalette verändern, doch es gibt ja Millionen Farben im System...
Die Palette des IE stellt schon viel mehr Farben zur Verfügung, ich habe hier eben nur auch aus Platzgründen eine kleinere Palette benutzt.

Nun kann ich nur noch viel Spaß beim Colorieren wünschen!
 

Dieser Tipp wurde bereits 12.309 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
   

Druckansicht Druckansicht Copyright ©2000-2020 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel