RSS
StartseiteKnowledge LibraryTop 10Impressum

Optimierte Spaltenbreite

Die Breite von Spalten eines ListView optimal dem Inhalt anpassen

Manuell lässt sich die Breite einer Spalte des ListView durch einen Doppelklick auf den Spaltentrenner dem breitestem Element dieser Spalte anpassen. Wie Sie diese Funktionalität im Code auslösen, zeigt dieser Artikel.

Bei dem ListView Steuerelement in der Report-Ansicht, lässt sich die Breite einer Spalte durch einen Doppelklick auf den Spaltentrenner dem breitesten Element anpassen. Die Tastenkombination <STRG>+<+> (Ziffernblock) optimiert die Breite aller Spalten des ListView.

Wenn Sie diese Funktionalität im Code auslösen möchten, senden Sie die Nachricht LVM_SETCOLUMNWIDTH und den Parameter LVSCW_AUTOSIZE über die API Funktion SendMessage an das ListView. Ersetzen Sie den Parameter LVSCW_AUTOSIZE durch LVSCW_AUTOSIZE_USEHEADER, können Sie dabei bestimmen, ob bei der automatischen Anpassung der Spaltenbreite die Breite der Spaltenbeschriftung berücksichtigt werden soll.

Verpackt in der Prozedur ColumnAutoSize, brauchen Sie dieser nur noch das betreffende ListView angeben und den Index der Spalte, die angepasst werden soll. Geben Sie keine Spalte an, wird die Breite aller Spalten angepasst. Optional kann über den Parameter UseHeader festgelegt werden, ob die Spaltenbeschriftung berücksichtigt werden soll:

Private Const LVM_FIRST = &H1000

Private Const LVM_SETCOLUMNWIDTH = (LVM_FIRST + 30)
Private Const LVSCW_AUTOSIZE = -1
Private Const LVSCW_AUTOSIZE_USEHEADER = -2

Private Declare Function SendMessage Lib "user32" Alias _
       "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _
        ByVal wParam As Long, ByRef lParam As Any) As Long

Public Sub ColumnAutoSize(ByRef ListView As ListView, _
                 Optional ByVal Column As Long = -1, _
                 Optional ByVal UseHeader As Boolean)
  Dim lngFlag As Long
  
  If (UseHeader) Then
    lngFlag = LVSCW_AUTOSIZE_USEHEADER
  Else
    lngFlag = LVSCW_AUTOSIZE
  End If
  
  If (Column <> -1) Then
    SendMessage ListView.hwnd, LVM_SETCOLUMNWIDTH, Column - 1, ByVal lngFlag
  Else
    With ListView
      For Column = 0 To .ColumnHeaders.Count - 1
        SendMessage .hwnd, LVM_SETCOLUMNWIDTH, Column, ByVal lngFlag
      Next
    End With
  End If
End Sub