| | | | | | | | | | |||||||
![]() | ![]() | | |||||||||||||
| |||||||||||||||
| |||||||
| Registrieren | Hilfe | Interessengemeinschaften | Kalender | Suchen | Heutige Beiträge | Alle Foren als gelesen markieren |
| |
![]() |
| | LinkBack | Themen-Optionen | Ansicht |
| | #1 |
| Registrierter Benutzer Reg.-Datum: 06.01.2004 Ort: Hannover |
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
__________________ Wissen ist der Gott, den ich verehre, und die Gesetze der Wissenschaft sind meine Religion. |
| | |
| | #2 |
| Reg.-Benutzer Reg.-Datum: 12.12.2005 Ort: Bremen |
Hi, eine Listbox hat keine Überschriften, meinst Du das ListView? Laut MSDN sind die Columns für die Scrollfunktion.
__________________ Gruß DevHB |
| | |
| | #3 |
| Registrierter Benutzer Reg.-Datum: 06.01.2004 Ort: Hannover |
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
__________________ Wissen ist der Gott, den ich verehre, und die Gesetze der Wissenschaft sind meine Religion. |
| | |
| | #4 |
| Reg.-Benutzer Reg.-Datum: 12.12.2005 Ort: Bremen |
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) ?
__________________ Gruß DevHB |
| | |
| | #5 |
| Registrierter Benutzer Reg.-Datum: 06.01.2004 Ort: Hannover |
Hallo, danke schonmal für deine Antworten. Es ist ein Standardcontrol aus Access VB 2002. Shrek
__________________ Wissen ist der Gott, den ich verehre, und die Gesetze der Wissenschaft sind meine Religion. |
| | |
| | #6 |
| Reg.-Benutzer Reg.-Datum: 12.12.2005 Ort: Bremen |
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?
__________________ Gruß DevHB |
| | |
| | #7 |
| Registrierter Benutzer Reg.-Datum: 06.01.2004 Ort: Hannover |
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
__________________ Wissen ist der Gott, den ich verehre, und die Gesetze der Wissenschaft sind meine Religion. |
| | |
| | #8 |
| Reg.-Benutzer Reg.-Datum: 12.12.2005 Ort: Bremen |
Hi, das ListView muss händisch gefüllt werden, z.B. mit einem ADO Recordset. So sieht bei mir eine Füllroutine aus: Code: 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
__________________ Gruß DevHB |
| | |
| | #9 |
| Reg.-Benutzer Reg.-Datum: 12.12.2005 Ort: Bremen |
So, TExt wäre zu lang, hier die Sortierung: Sortieren kannst Du dann mit folgender Funktion: Code: 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
Code:
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
__________________ Gruß DevHB |
| | |
| | #10 |
| Registrierter Benutzer Reg.-Datum: 06.01.2004 Ort: Hannover |
Vielen Dank. Shrek
__________________ Wissen ist der Gott, den ich verehre, und die Gesetze der Wissenschaft sind meine Religion. |
| | |
| | #11 |
| Reg.-Benutzer Reg.-Datum: 20.06.2008 |
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: Code: Private Sub Listbox1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) SortListbox Listbox1, X, Y End Sub Listbox in Access per Mausklick sortieren Viel Spaß damit Geändert von WernerMager (20.06.2008 um 21:41 Uhr) |
| | |
![]() |
| Tags: ansprechen , listbox , spaltenueberschrift |
| Lesezeichen |
| ||||||
| Themen-Optionen | |
| Ansicht | |
| |
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| vb.net listbox | jasso | Basic | 4 | 31.08.2005 15:31 |
| ComboBox im der Spaltenüberschrift | Marry | Java | 1 | 18.02.2005 09:31 |
| Listview Spaltenüberschrift vertikal | moloch | Delphi/RPG+CL/Sonstige | 2 | 27.09.2004 11:22 |
| ListBox.AddItem | matthiasr | Datenbanken | 0 | 15.10.2003 16:18 |
| multiple Listbox | Felicie | Webdesign | 1 | 12.09.2002 11:34 |
![]() |
| |||||