Rubrik: Controls · ListView | VB-Versionen: VB4, VB5, VB6 | 27.04.03 |
Automatische Spaltenbreite im ListView-Control Dieser Tipp verrät, wie sich die optimale Spaltenbreite für ein ListView Control automatisch einstellen lässt. | ||
Autor: Roland Wutzke | Bewertung: | Views: 35.029 |
www.vb-power.net | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
In einen früheren Tipp wurde Ihnen bereits gezeigt, wie Sie alle Spalten eines ListView Controls auf die optimale Breite einstellen können. Doch was ist, wenn Sie nur eine oder mehere Spalten automatisch auf die optimale Breite setzen wollen?
Das nachfolgende Modul zeigt Ihnen einen etwas anderen Weg und zusätzliche noch weitere Funktionen, um eine einzelne, bzw. mehrere Spalten gleichzeiig einzustellen.
Folgende Funktionen stehen zur Verfügung:
- lvwSetSingleColWidth: stellt eine einzelne Spalte ein
- lvwSetMultiColWidth: stellt eine Liste von Spalten ein
- lvwSetAllColWidth: stellt alle Spalten auf einmal ein
Optional kann festgelegt werden, ob der Spalten-Header ebenfalls berücksichtigt werden soll:
- lvw_AUTOSIZE: Header nicht berücksichtigen
- lvw_AUTOSIZE_WITH_HEADER: Header berücksichtigen (Default)
' ********************************************************************* ' * ' * Modul mod_lvwResize ' * ' * Stellt die Spaltenbreite eines ListView-Controls automatisch ' * auf die optimale Breite ein. Es stehen folgende Funktionen ' * zur Verfügung: ' * ' * lvwSetSingleColWidth -> stellt eine einzelne Spalte ein ' * lvwSetMultiColWidth -> stellt eine Liste von Spalten ein ' * lvwSetAllColWidth -> stellt alle Spalten auf einmal ein ' * ' * Optional kann festgelegt werden, ob der Spalten-Header ' * berücksichtigt werden soll: ' * ' * lvw_AUTOSIZE -> Header nicht berücksichtigen ' * lvw_AUTOSIZE_WITH_HEADER -> Header berücksichtigen(Default) ' * ' * April 2003 - Roland Wutzke ' * ' ********************************************************************* Option Explicit ' benötigte API Private Declare Function SendMessage Lib "user32" _ Alias "SendMessageA" ( _ ByVal hWnd As Long, _ ByVal wMsg As Long, _ ByVal wParam As Long, _ lParam As Any) As Long ' benötigte Konstanten Private Const LVM_FIRST As Long = &H1000 Private Const LVM_SETCOLUMNWIDTH As Long = LVM_FIRST + 30 ' benötigte Aufzählung Public Enum lvw_Styles lvw_AUTOSIZE = -1 lvw_AUTOSIZE_WITH_HEADER = -2 End Enum
Public Sub lvwSetAllColWidth(oListView As ListView, _ Optional ByVal Style As lvw_Styles = lvw_AUTOSIZE_WITH_HEADER) Dim ColumnIndex As Long With oListView ' Schleife über die Anzahl von Spalten im Listview For ColumnIndex = 1 To .ColumnHeaders.Count ' Spalte übergeben und Breite einstellen lvwSetSingleColWidth oListView, _ ColumnIndex, Style Next ColumnIndex End With End Sub
Public Sub lvwSetMultiColWidth(oListView As ListView, _ ByVal ColumnArray As Variant, _ Optional ByVal Style As lvw_Styles = lvw_AUTOSIZE_WITH_HEADER) Dim ColumnIndex As Long ' Prüfen, ob das übergebene Array ein Array ist If IsArray(ColumnArray) Then With oListView ' Schleife über die gesamte Länge des Arrays For ColumnIndex = LBound(ColumnArray) To UBound(ColumnArray) ' Prüfen, ob das Array(Index) gültig ist If ColumnArray(ColumnIndex) <= .ColumnHeaders.Count Then ' Spalte aus dem Array übergeben und Breite einstellen lvwSetSingleColWidth oListView, _ ColumnArray(ColumnIndex), Style End If Next ColumnIndex End With End If End Sub
Public Sub lvwSetSingleColWidth(oListView As ListView, ByVal ColumnIndex As Long, _ Optional ByVal Style As lvw_Styles = lvw_AUTOSIZE_WITH_HEADER) With oListView ' Prüfen, ob das Listview in der Ansicht "Report" ist If .View = lvwReport Then ' Prüfen, ob der übergebene Spaltenindex zulässig ist If ColumnIndex >= 1 And ColumnIndex <= .ColumnHeaders.Count Then ' API Aufruf an das Listview und Spalte einstellen Call SendMessage(.hWnd, LVM_SETCOLUMNWIDTH, _ ColumnIndex - 1, ByVal Style) End If End If End With End Sub
Beispiel: (Sie benötigen eine Form mit einem ListView Control)
' Alle Spalten sollen eingestellt werden. Dabei soll ' auch der Column-Header berücksichtigt werden. lvwSetAllColWidth ListView1
' Alle Spalten einstellen und den Header ' nicht berücksichtigen lvwSetAllColWidth ListView1, lvw_AUTOSIZE
' Nur bestimmte Spalten sollen eingestellt werden. ' Die Liste wird mit einem Array abgebildet. In diesem Fall ' werden die Spalten 1,3,4 und 6 übergeben. Dim colArray As Variant colArray = Array(1, 3, 4, 6) lvwSetMultiColWidth ListView1, colArray
' Nur eine einzelne Spalte wird eingestellt. lvwSetSingleColWidth ListView1, 1