IT-Shrek Geschrieben 21. September 2006 Geschrieben 21. September 2006 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 Zitieren
DevHB Geschrieben 21. September 2006 Geschrieben 21. September 2006 Hi, eine Listbox hat keine Überschriften, meinst Du das ListView? Laut MSDN sind die Columns für die Scrollfunktion. Zitieren
IT-Shrek Geschrieben 21. September 2006 Autor Geschrieben 21. September 2006 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 Zitieren
DevHB Geschrieben 21. September 2006 Geschrieben 21. September 2006 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) ? Zitieren
IT-Shrek Geschrieben 21. September 2006 Autor Geschrieben 21. September 2006 Hallo, danke schonmal für deine Antworten. Es ist ein Standardcontrol aus Access VB 2002. Shrek Zitieren
DevHB Geschrieben 21. September 2006 Geschrieben 21. September 2006 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? Zitieren
IT-Shrek Geschrieben 21. September 2006 Autor Geschrieben 21. September 2006 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 Zitieren
DevHB Geschrieben 21. September 2006 Geschrieben 21. September 2006 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). Zitieren
DevHB Geschrieben 21. September 2006 Geschrieben 21. September 2006 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 Zitieren
IT-Shrek Geschrieben 22. September 2006 Autor Geschrieben 22. September 2006 Vielen Dank. Shrek Zitieren
WernerMager Geschrieben 20. Juni 2008 Geschrieben 20. Juni 2008 (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 20. Juni 2008 von WernerMager Zitieren
Empfohlene Beiträge
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.