none
"Sortierungs-Pfeil" in ListView ActiveX Control in Spalten-Überschrift anzeigen funktioniert nicht.

    Frage

  • Hallo zusammen,

    diesmal auf Deutsch. :-)

    Ich habe ein Formular mit einem ListView ActiveX Control, welches den Inhalt eines RecordSets anzeigt. Das funktioniert soweit.

    Auch das Sortieren des Inhalts durch Anklicken einer Spaltenüberschrift klappt. Aber ich würde gerne durch dieses kleine Pfeilsymbol rechts neben der Spaltenüberschrift anzeigen nach welcher Spalte und in welche Richtung sortiert ist.

    Da es keine entsprechende Property in der ColumnHeader-Klasse gibt, dachte ich mir das sollte über die WinAPI realisierbar sein.

    Hier meine bisherigen Bemühungen:
    Public Sub IndicateSortOrderInListViewColumn(lvListView As Object)
        Dim hHeaderHandle As Long
        Dim header As HDITEM
        Dim column As Long
        Dim lNumColumns As Long
        
        hHeaderHandle = SendMessage(lvListView.hwnd, LVM_GETHEADER, 0, 0)
        lNumColumns = SendMessage(hHeaderHandle, HDM_GETITEMCOUNT, 0, 0)
        
        For column = 0 To lNumColumns - 1
            header.mask = HDI_FORMAT
            Call SendMessageHDITEM(hHeaderHandle, HDM_GETITEM, column, header)
            ' Reset bits
            header.fmt = header.fmt And (Not HDF_SORTDOWN) And (Not HDF_SORTUP)
            If lvListView.SortKey = column Then
                If lvListView.SortOrder = lvwAscending Then
                    header.fmt = header.fmt Or HDF_SORTUP
                Else
                    header.fmt = header.fmt Or HDF_SORTDOWN
                End If
            End If
            Call SendMessageHDITEM(hHeaderHandle, HDM_SETITEM, column, header)
        Next column
    End Sub
    

     Das funktioniert auch alles soweit, nur wird kein Pfeil dargestellt. Es ist als würden die Flags einfach ignoriert. Ich habe einige andere Flags versucht um zu prüfen, ob HDM_SETITEM überhaupt funktioniert und ich konnte z.B. die Spalten-Überschrift rechtsbündig ausrichten und sogar den Text selber ändern.

    Hier der API-Teil:
    Public Const HDI_TEXT As Long = &H2
    Public Const HDI_FORMAT As Long = &H4
    
    Public Const HDF_LEFT As Long = &H0
    Public Const HDF_RIGHT As Long = &H1
    Public Const HDF_CENTER As Long = &H2
    Public Const HDF_SORTDOWN As Long = &H200
    Public Const HDF_SORTUP As Long = &H400
    
    Public Const HDM_GETITEMCOUNT As Long = &H1200
    Public Const HDM_GETITEM As Long = &H1203
    Public Const HDM_SETITEM As Long = &H1204
    
    Public Type HDITEM
        mask As Long
        cxy As Long
        pszText As String
        hbm As Long
        cchTextMax As Long
        fmt As Long
        lParam As Long
        iImage As Long
        iOrder As Long
        iType As Long
        pvFilter As Long
        iState As Long
    End Type
    
    Declare Function SendMessage Lib "user32" _
      Alias "SendMessageA" ( _
      ByVal hwnd As Long, _
      ByVal Msg As Long, _
      wParam As Any, _
      lParam As Any) As Long
    
    Declare Function SendMessageHDITEM Lib "user32" _
      Alias "SendMessageA" ( _
      ByVal hwnd As Long, _
      ByVal Msg As Long, _
      ByVal wParam As Long, _
      lpHDITEM As HDITEM) As Boolean
    


    Meine Umgebung:

    Win7, Office 2010

    Wo liegt hier der Fehler:

    Grüße

    Dirk Mika

    Freitag, 23. September 2011 08:24

Antworten

  • Hallo,

    ok, das wäre auch eine Möglichkeit. Aber ich habe es nun doch noch über die API hinbekommen. Ich habe nicht die Version 6, sondern die Version 5 des ListViews eingebunden und plötzlich wird nicht nur die ganze Sache mit passendem Design versehen, sondern auch die Pfeile dargestellt.

    Gruß

    Dirk

     

    Dienstag, 27. September 2011 10:27

Alle Antworten

  • Hallo Dirk,
    ich habe damals das gleiche Problem gehabt J Damals habe ich beim ListView_ColumnClick Event ein „/\“ bzw. ein „\/“ zu dem Column-Text addiert:
    Private Sub ListView5_ColumnClick(ByVal ColumnHeader As Object)
        Dim i As Integer
        
        For i = 1 To ListView5.ColumnHeaders.Count
            ListView5.ColumnHeaders(i).Text = Replace(ListView5.ColumnHeaders(i).Text, "   /\", "")
            ListView5.ColumnHeaders(i).Text = Replace(ListView5.ColumnHeaders(i).Text, "   \/", "")
        Next i
        
        If ListView5.SortOrder = 1 Then
            ListView5.SortOrder = 0
            ColumnHeader.Text = ColumnHeader.Text + "   /\"
        Else
            ListView5.SortOrder = 1
            ColumnHeader.Text = ColumnHeader.Text + "   \/"
        End If
        ListView5.Sorted = True
        
    End Sub
    

    sieht irgenwie so aus:
     
    Grüße,
    Bogdan

    Ich bin gerne bei den Foren. Es kommt von Herzen. Es wird aber keine implizite oder sonstige Garantie für die geposteten Antworte / Informationen gewährt. Hier auch die Forenregeln.
    Dienstag, 27. September 2011 07:29
    Moderator
  • Hallo,

    ok, das wäre auch eine Möglichkeit. Aber ich habe es nun doch noch über die API hinbekommen. Ich habe nicht die Version 6, sondern die Version 5 des ListViews eingebunden und plötzlich wird nicht nur die ganze Sache mit passendem Design versehen, sondern auch die Pfeile dargestellt.

    Gruß

    Dirk

     

    Dienstag, 27. September 2011 10:27