vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
NEU! sevCoolbar 2.0 - Professionelle Toolbars im modernen Design!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Newsletter  | Impressum  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2015
 
zurück
Rubrik: Controls · ListView   |   VB-Versionen: VB605.10.09
Einzelne Zeilen im ListView färben (Hintergrund und Schrift)

Das Einfärben einzelner ListView Zeilen ist beim ListView von Haus aus leider nicht gestattet. Hier ein Tipp, wie man es mit Subclassing doch hinbekommen kann.

Autor:   VBMichiBewertung:     [ Jetzt bewerten ]Views:  11.385 
www.michael-kaupp.comSystem:  Win9x, WinNT, Win2k, WinXP, Vista, Win7, Win8 Beispielprojekt auf CD 

Summer-Special bei Tools & Components!
Gute Laune Sommer bei Tools & Components
Top Summer-Special - Sparen Sie teilweise über 100,- EUR
Alle sev-Entwicklerkomponenten und Komplettpakete jetzt bis zu 25% reduziert!
zum Beispiel:
  • Developer CD nur 455,- EUR statt 569,- EUR
  • sevDTA 2.0 nur 224,30 EUR statt 299,- EUR
  •  
  • vb@rchiv   Vol.6 nur 18,70 EUR statt 24,95 EUR
  • sevCoolbar 3.0 nur 58,70 EUR statt 69,- EUR
  • - Werbung -Und viele weitere Angebote           Aktionspreise nur für kurze Zeit gültig

    Das Einfärben einzelner ListView Zeilen ist beim ListView von Haus aus leider nicht gestattet. Hier ein Tipp, wie man es mit Subclassing doch hinbekommen kann.

    ACHTUNG: Das Subclassing muss beim Unload unbedingt wieder deaktiviert werden, sonst stürzt VB ab. Beim Testen bitte NICHT den Stop-Button der VB-Entwicklungsumgebung verwenden.

    Folgenden Code in ein Modul kopieren:

    Option Explicit
     
    ' Benötigte API Deklarationen
    Public Declare Function SetWindowLong Lib "user32.dll" _
      Alias "SetWindowLongA" ( _
      ByVal hWnd As Long, _
      ByVal nIndex As Long, _
      ByVal dwNewLong As Long) As Long
     
    Public Declare Sub CopyMemory Lib "kernel32.dll" _
      Alias "RtlMoveMemory" ( _
      Destination As Any, _
      Source As Any, _
      ByVal Length As Long)
     
    Public Declare Function CallWindowProc Lib "user32.dll" _
      Alias "CallWindowProcA" ( _
      ByVal lpPrevWndFunc As Long, _
      ByVal hWnd As Long, _
      ByVal Msg As Long, _
      ByVal wParam As Long, _
      ByVal lParam As Long) As Long
     
    ' Benötigte öffentliche Konstante
    Public Const GWL_EXSTYLE = -20
    Public Const GWL_HINSTANCE = -6
    Public Const GWL_HWNDPARENT = -8
    Public Const GWL_ID = -12
    Public Const GWL_STYLE = -16
    Public Const GWL_USERDATA = -21
    Public Const GWL_WNDPROC = -4
    Public Const DWL_DLGPROC = 4
    Public Const DWL_MSGRESULT = 0
    Public Const DWL_USER = 8
     
    Public Const NM_CUSTOMDRAW = (-12&)
    Public Const WM_NOTIFY As Long = &H4E&
    Public Const CDDS_PREPAINT As Long = &H1&
    Public Const CDRF_NOTIFYITEMDRAW As Long = &H20&
    Public Const CDDS_ITEM As Long = &H10000
    Public Const CDDS_ITEMPREPAINT As Long = CDDS_ITEM Or CDDS_PREPAINT
    Public Const CDRF_NEWFONT As Long = &H2&
     
    Public Type NMHDR
      hWndFrom As Long   ' Fenster Handle des sendenden Controls
      idFrom As Long     ' ID des sendenden Controls
      code  As Long      ' Code
    End Type
     
    ' Substruktur der NMCUSTOMDRAW Struktur
    Public Type RECT
      Left As Long
      Top As Long
      Right As Long
      Bottom As Long
    End Type
     
    ' generische CustomDraw Struktur
    Public Type NMCUSTOMDRAW
      hdr As NMHDR
      dwDrawStage As Long
      hDC As Long
      rc As RECT
      dwItemSpec As Long
      uItemState As Long
      lItemlParam As Long
    End Type
     
    ' ListView spezifische CustomDraw Struktur
    Public Type NMLVCUSTOMDRAW
      nmcd As NMCUSTOMDRAW
      clrtext As Long
      clrtextbk As Long
      ' Falls der IE >= 4.0, kann dieses Mitglied der Struktur auch verwendet werden:
      'iSubItem As Integer
    End Type
     
    ' Öffentliche Variablen
    Public g_addProcOld As Long
    Public g_MaxItems As Long
    Public clrtextbk() As Long
    Public clrtext() As Long
    ' Öffentliche Funktion zum "ReDrawen" des ListViews
    Public Function WindowProc(ByVal hWnd As Long, _
      ByVal iMsg As Long, ByVal wParam As Long, _
      ByVal lParam As Long) As Long
     
      Select Case iMsg
        Case WM_NOTIFY
          Dim udtNMHDR As NMHDR
          CopyMemory udtNMHDR, ByVal lParam, 12&
     
          With udtNMHDR
            If .code = NM_CUSTOMDRAW Then
              Dim udtNMLVCUSTOMDRAW As NMLVCUSTOMDRAW
              CopyMemory udtNMLVCUSTOMDRAW, ByVal lParam, Len(udtNMLVCUSTOMDRAW)
     
              With udtNMLVCUSTOMDRAW.nmcd
     
                Select Case .dwDrawStage
                  Case CDDS_PREPAINT
                    WindowProc = CDRF_NOTIFYITEMDRAW
                    Exit Function
     
                  Case CDDS_ITEMPREPAINT
                    If clrtext(.dwItemSpec) <> 0 Or clrtextbk(.dwItemSpec) <> 0 Then
                      ' Farbe des Textes, des Eintrages,
                      ' wird mit der nächsten Zeile bestimmt:
                      If clrtext(.dwItemSpec) <> 0 Then
                        udtNMLVCUSTOMDRAW.clrtext = clrtext(.dwItemSpec)
                      End If
                      If clrtextbk(.dwItemSpec) <> 0 Then
                        udtNMLVCUSTOMDRAW.clrtextbk = clrtextbk(.dwItemSpec)
                      End If
                      CopyMemory ByVal lParam, udtNMLVCUSTOMDRAW, Len(udtNMLVCUSTOMDRAW)
                    End If
                    WindowProc = CDRF_NEWFONT
                    Exit Function
                End Select
     
              End With
            End If
          End With
     
      End Select
     
      WindowProc = CallWindowProc(g_addProcOld, hWnd, iMsg, wParam, lParam)
    End Function
    ' Öffentliche Funktion, um die Hintergrundfarbe eines ListView Eintrages zu ändern
    Public Sub SetLIBackColor(lv As ListView, nitem As Integer, BkColor As Long)
      clrtextbk(nitem - 1) = BkColor
      lv.Refresh
    End Sub
    ' Öffentliche Funktion, um die Schriftfarbe eines ListView Eintrages zu ändern
    Public Sub SetLIForeColor(lv As ListView, nitem As Integer, ForeColor As Long)
      clrtext(nitem - 1) = ForeColor
      lv.Refresh
    End Sub

    Jetzt auf die Form folgende Controls platzieren:

    • ListView1 (ListView)
    • Command1 (CommandButton)

    Folgenden Code in den Code-Teil der Form einfügen:

    Option Explicit
     
    Private Sub Form_Load()
      With ListView1
        ' ListView Darstellung
        .View = lvwReport
        .FullRowSelect = True
        .GridLines = True
        .Width = 5600
        .Height = 2300
     
        ' ListView-Spalten hinzufügen
        .ColumnHeaders.Add 1, , "ID"
        .ColumnHeaders.Add 2, , "Vorname"
        .ColumnHeaders.Add 3, , "Nachname"
     
        ' Spalten-Breiten festlegen
        .ColumnHeaders(1).Width = 1500
        .ColumnHeaders(2).Width = 2000
        .ColumnHeaders(3).Width = 2000
     
        ' Vier Einträge hinzufügen
        .ListItems.Add 1, , "1"
        .ListItems(1).SubItems(1) = "Martin"
        .ListItems(1).SubItems(2) = "Mustermann"
        .ListItems.Add 2, , "2"
        .ListItems(2).SubItems(1) = "Max"
        .ListItems(2).SubItems(2) = "Mustermann"
        .ListItems.Add 3, , "3"
        .ListItems(3).SubItems(1) = "Michael"
        .ListItems(3).SubItems(2) = "Mustermann"
        .ListItems.Add 4, , "4"
        .ListItems(4).SubItems(1) = "Marco"
        .ListItems(4).SubItems(2) = "Mustermann"
      End With
     
      Command1.Caption = "Färbe Zeile 3 rot ein, " & _
        "und ändere ihre Schriftfarbe in gelb!"
     
      ' Subclassing aktivieren
      ReDim Preserve clrtext(ListView1.ListItems.Count)
      ReDim Preserve clrtextbk(ListView1.ListItems.Count)
      g_MaxItems = ListView1.ListItems.Count - 1
      g_addProcOld = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WindowProc)
    End Sub
    Private Sub Command1_Click()
      ' ListView einfärben (Funktionsaufruf im Modul)
      SetLIBackColor ListView1, 3, vbRed
      SetLIForeColor ListView1, 3, vbYellow
    End Sub
    ' --------------------------------------------------------------
    ' !!!!WICHTIG!!!!
    ' --------------------------------------------------------------
    ' Das Programm muss unbedingt über die Unload-Funktion
    ' beendet werden, sonst stürzt Visual Basic ab!
    '
    ' Zum Beenden des Programmes NICHT den VB-Stoppknopf
    ' verwenden, sondern das Programm über das rote X schließen !!!
    ' --------------------------------------------------------------
    Private Sub Form_Unload(Cancel As Integer)
      ' Subclassing deaktivieren
      SetWindowLong hWnd, GWL_WNDPROC, g_addProcOld
    End Sub

    Dieser Tipp wurde bereits 11.385 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.

    Aktuelle Diskussion anzeigen (6 Beiträge)

    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-2015 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