Zum Inhalt springen

VB Listbox Spaltenüberschrift ansprechen


Empfohlene Beiträge

Geschrieben

Hallo,

ich habe eine Listbox mit Spaltenüberschriften und möchte beim Klick auf die Überschrift eine Sortierung ausführen, doch leider weiss ich nicht wie ich die Überschrift in VB ansprechen kann.

Hat jemand von euch das nötige Wissen?

Danke, Shrek

Geschrieben

Hallo,

Verzeihung fals ich mich unklar ausgedrückt habe. Ich gebe eine SQL Tabelle in einer Listbox (ja listbox) aus. Die Listbox hat die Eigenschaft "Spaltenüberschriften (ColumnHeads)" wo ich auswählen kann ob sie angezeigt werden oder nicht.

Auf diese Spaltenüberschriften möchte ich nun ein Sortierungsevent legen.

Danke, Shrek

Geschrieben

Hi,

kann ich nicht nachvollziehen, habe eine ListBox auf der Form, das Einzige was ich habe ist "List1.Columns".

Bist Du in Visual Studio oder einer OfficeAnwendung?

Woher kommt die ListBox (standardcontrols oder andere Lib) ?

Geschrieben

Hi,

so, da haben wirs ja schon ;)

Das sind dann die Steuerelemente aus der Forms2 Lib.

Access hat kein VB, sondern VBA.

So wie es aussieht, gibt es keine Boardmöglichkeiten darauf zuzugreifen.

Eventuell gehts mit API, Cursor auslesen usw, aber denke mal zu aufwendig.

Frage: Warum kein ListView, damit gehts ohne Probleme?

Geschrieben

Hallo,

danke für den Hinweis.

Mit Listview habe ich keinerlei Erfahrung, ich habe nun ein Listview Element in mein Formular eingefügt, leider hat Listview jedoch keine Eigenschaft Datensatzherkunft / Rowsource, von daher weiss ich nun leider nicht was ich damit tun soll.

Danke, Shrek

Geschrieben

Hi,

das ListView muss händisch gefüllt werden, z.B. mit einem ADO Recordset.

So sieht bei mir eine Füllroutine aus:


Public Sub lvwFill(ByRef Rs As ADODB.Recordset, _

                            ByRef Lvw As MSComctlLib.ListView _

)


    Dim li    As MSComctlLib.ListItem

    Dim i     As Long, _

        lRet  As Long


    With Lvw

        ' listview sperren (flackern unterbinden)

        lRet = modWinAPI.LockWindowUpdate(Lvw.hwnd)

        If (Not (modWinAPI.LockWindowError(lRet))) Then

            Exit Sub

        End If


        .Visible = False


        Call .ListItems.Clear

        Call .ColumnHeaders.Clear


        .FullRowSelect = True

        .MultiSelect = False

        .GridLines = True

        .LabelEdit = lvwManual

        .View = lvwReport


        ' add column header

        For i = 0 To Rs.Fields.Count - 1

            Call .ColumnHeaders.Add(, , Rs.Fields(i).Name)

        Next i


        For i = 1 To .ColumnHeaders.Count

            Select Case i

                Case 1:

                    .ColumnHeaders(i).Alignment = lvwColumnLeft

                    .ColumnHeaders(i).Width = 800

                Case 5, 6, 7:

                    .ColumnHeaders(i).Alignment = lvwColumnCenter

                Case 2, 3, 4:

                    .ColumnHeaders(i).Alignment = lvwColumnLeft

                Case 8:

                    .ColumnHeaders(i).Width = 0

            End Select

        Next i


        If (Rs.RecordCount = 0) Then

            .Visible = True

            Set li = Nothing

            Call OptimizeWidth(Lvw, 1, Lvw.ColumnHeaders.Count - 1)

            Lvw.ColumnHeaders(9).Width = 0

            Lvw.ColumnHeaders(10).Width = 0


            lRet = modWinAPI.LockWindowUpdate(modWinAPI.LOCKWINDOW_UNLOCK)

            Exit Sub

        End If


        Call Rs.MoveFirst

        Do While (Not (Rs.EOF))

            Set li = .ListItems.Add(, Rs.AbsolutePosition & "x", GetText(Rs.Fields(0).Value))

            li.SubItems(1) = GetText(Rs.Fields(1).Value)

            li.SubItems(2) = GetText(Rs.Fields(2).Value)

            li.SubItems(3) = GetText(Rs.Fields(3).Value)

            li.SubItems(4) = GetText(Rs.Fields(4).Value)

            li.SubItems(5) = GetText(Rs.Fields(5).Value)

            li.SubItems(6) = GetText(Rs.Fields(6).Value)

            li.SubItems(7) = GetText(Rs.Fields(7).Value)

            li.SubItems(8) = GetText(Rs.Fields(8).Value)

            li.SubItems(9) = GetText(Rs.Fields(9).Value)


            Call Rs.MoveNext

        Loop

        .Visible = True

        Call .Refresh

    End With

    Call Rs.MoveFirst


    Set li = Nothing


    Call OptimizeWidth(Lvw, 1, Lvw.ColumnHeaders.Count - 1)


    Lvw.ColumnHeaders(9).Width = 0

    Lvw.ColumnHeaders(10).Width = 0



    ' Listview entsperren

    ' lRet = modWinAPI.LockWindowUpdate(modWinAPI.LOCKWINDOW_UNLOCK)

End Sub

Wobei "OptimizeWidth, LockWindowUpdate" nur Funktionen mit API Aufruf sind (erstmal nicht so wichtig).

Geschrieben

So,

TExt wäre zu lang, hier die Sortierung:

Sortieren kannst Du dann mit folgender Funktion:


Public Enum lvwSortType

  SortText = 0

  SortNumeric = 1

  SortDate = 2

  SortHHMM = 3

  SortHHMMSS = 4

  SortFileDateTime = 5

End Enum


Public Sub MultiSortListView(ByVal Index As Integer, ByVal CurrentListView As ListView, Optional vSortType As lvwSortType = SortText)


  Dim i As Integer

  Dim strFormat As String

  Dim strData() As String

  Dim lRet As Long


  On Error GoTo ErrorHandler


  ' Benutzerdefinierter Formatstring für die

  ' Format-Funktion ermitteln.

  Select Case vSortType

    ' Wenn vSortType = SortText, Standard Sortierung

    ' nach String erzwingen und die Sub verlassen.

    Case SortText

      With CurrentListView

        .SortKey = Index

        .Sorted = True

        .SortOrder = 1 - .SortOrder

        Exit Sub

      End With


    ' Formatstring für numerische Sortierung setzen

    Case SortNumeric

      strFormat = String(30, "0") & "." & String(30, "0")


    ' Formatstring für Sortierung nach Datum setzen

    Case SortDate

      strFormat = String(2, "0") & "." & String(2, "0") & "." & String(4, "0")


    ' Formatstring für Sortierung nach Zeit HHMM setzen

    Case SortHHMM

      strFormat = "hh:mm"


    ' Formatstring für Sortierung nach Zeit HHMMSS setzen

    Case SortHHMMSS

      strFormat = "hh:mm:ss"


    ' Formatstring für Sortierung nach FileDateTime setzen

    Case SortFileDateTime

      strFormat = String(2, "0") & "." & String(2, "0") & "." & String(4, "0")

      strFormat = strFormat & " " & "hh:mm:ss"


    ' Falscher, bzw. ungültiger SortType, dann Sub verlassen

    Case Else

      Exit Sub

  End Select


  ' Automatische Aktualisierung des Fensters sperren

  lRet = modWinAPI.LockWindowUpdate(CurrentListView.Parent.hwnd)

  If lRet = 0& Then

    Call MsgBox("Can't lock window " & _

      CurrentListView.Parent.hwnd, _

      vbOKOnly + vbCritical)

    Exit Sub

  End If


  With CurrentListView

    With .ListItems

      If (Index > 0) Then ' Sortierung nach Subitems

        For i = 1 To .Count

          With .Item(i).ListSubItems(Index)

            ' Sichern des aktuellen Wertes der

            ' Text-Eigenschaft in der Tag-Eigenschaft,

            ' ohne einen evtl. Inhalt der Tag-Eigenschaft

            ' zu überschreiben

            .Tag = .Text & vbNullChar & .Tag

            Select Case vSortType

              Case SortNumeric

                ' Falls die Text-Eigenschaft der SubItems

                ' eine Zahl ist, so formatiere mit dem oben

                ' definierten Formatstring.

                If IsNumeric(.Text) Then

                  .Text = Format$(CDbl(.Text), strFormat)

                End If

              Case SortDate

                ' Falls die Text-Eigenschaft der SubItems

                ' ein Datum ist, so formatiere mit dem oben

                ' definierten Formatstring.

                If IsDate(.Text) Then

                  .Text = Format$(CDate(.Text), strFormat)

                End If

              Case SortHHMM

                ' Falls die Text-Eigenschaft der SubItems

                ' Zeit HH:MM ist, so formatiere mit dem oben

                ' definierten Formatstring.

                .Text = Format$(.Text, strFormat)

              Case SortHHMMSS

                ' Falls die Text-Eigenschaft der SubItems

                ' Zeit HH:MM:SS ist, so formatiere mit dem oben

                ' definierten Formatstring.

                .Text = Format$(.Text, strFormat)

              Case SortFileDateTime

                ' Falls die Text-Eigenschaft der SubItems

                ' VB FileDateTime ist, so formatiere mit dem oben

                ' definierten Formatstring.

                .Text = Format$(.Text, strFormat)

            End Select

          End With

        Next i

      Else ' Sortierung nach Mainitem

        For i = 1 To .Count

          With .Item(i)

            ' Sichern des aktuellen Wertes der

            ' Text-Eigenschaft in der Tag-Eigenschaft,

            ' ohne einen evtl. Inhalt der Tag-Eigenschaft

            ' zu überschreiben

            .Tag = .Text & vbNullChar & .Tag

            Select Case vSortType

              Case SortNumeric

                ' Falls die Text-Eigenschaft der SubItems

                ' eine Zahl ist, so formatiere mit dem oben

                ' definierten Formatstring.

                If IsNumeric(.Text) Then

                  .Text = Format$(CDbl(.Text), strFormat)

                End If

              Case SortDate

                ' Falls die Text-Eigenschaft der SubItems

                ' ein Datum ist, so formatiere mit dem oben

                ' definierten Formatstring.

                If IsDate(.Text) Then

                  .Text = Format$(CDate(.Text), strFormat)

                End If

              Case SortHHMM

                ' Falls die Text-Eigenschaft der SubItems

                ' Zeit HH:MM ist, so formatiere mit dem oben

                ' definierten Formatstring.

                .Text = Format$(.Text, strFormat)

              Case SortHHMMSS

                ' Falls die Text-Eigenschaft der SubItems

                ' Zeit HH:MM:SS ist, so formatiere mit dem oben

                ' definierten Formatstring.

                .Text = Format$(.Text, strFormat)

              Case SortFileDateTime

                ' Falls die Text-Eigenschaft der SubItems

                ' VB FileDateTime ist, so formatiere mit dem oben

                ' definierten Formatstring.

                .Text = Format$(.Text, strFormat)

            End Select

          End With

        Next i

      End If

    End With


    ' Sortiere die umformatierten Spalten neu

    .SortKey = Index

    .Sorted = True

    .SortOrder = 1 - .SortOrder


    With .ListItems

      If (Index > 0) Then ' Sortierung nach SubItem

        For i = 1 To .Count

          With .Item(i).ListSubItems(Index)

            ' Extrahiere den ursprünglichen Inhalt des

            ' Subitems aus der Tag Eingeschaft und

            ' stelle ihn wieder in die Text-Eigenschaft

            ' ein.

            strData = Split(.Tag, vbNullChar)

            .Text = strData(0)

            .Tag = strData(1)

          End With

        Next i

      Else ' Sortierung nach MainItem

        For i = 1 To .Count

          With .Item(i)

            ' Extrahiere den ursprünglichen Inhalt des

            ' Subitems aus der Tag Eingeschaft und

            ' stelle ihn wieder in die Text-Eigenschaft

            ' ein.

            strData = Split(.Tag, vbNullChar)

            .Text = strData(0)

            .Tag = strData(1)

          End With

        Next i

      End If

    End With

  End With


  ' Aufheben der Aktualisierungssperre für das Fenster

  lRet = modWinAPI.LockWindowUpdate(0&)

  Exit Sub


ErrorHandler:

  lRet = modWinAPI.LockWindowUpdate(0&)

  Call MsgBox("Runtime error " & Err.Number & ": " & _

    vbCrLf & Err.Description, vbOKOnly + vbCritical)

End Sub

Aufruf im ColumnClick Event vom Listview:


Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)

'

    Dim nIndex As Integer

    nIndex = ColumnHeader.Index - 1

    ' auswahl ob text, numeric, date

    Select Case nIndex

        Case 0, 1, 2, 3, 4:

            Call MultiSortListView(nIndex, ListView1, lvwSortType.SortText)

    End Select

End Sub

  • 1 Jahr später...
Geschrieben (bearbeitet)

Hallo,

ich hatte genau das gleiche Problem und habe mir eine Funktion geschrieben, mit dem das geht. Man muss nur das Mouse-Down-Event implementieren und dort die Funktion aufrufen:


Private Sub Listbox1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

  SortListbox Listbox1, X, Y

End Sub

Das Modul dazu gibts in meinem Blog:

Listbox in Access per Mausklick sortieren

Viel Spaß damit :)

Bearbeitet von WernerMager

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...