Startseite
Stellenmarkt
Downloads
Kontakt
  Community Center:   Forum  |  Gruppen  |  Chat  |

Zurück   Forum Fachinformatiker.de > Programmierung > Basic



Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 21.09.2006, 10:39   #1
Registrierter Benutzer
 
Benutzerbild von IT-Shrek
 
Reg.-Datum: 06.01.2004
Ort: Hannover
Standard VB Listbox Spaltenüberschrift ansprechen

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.
IT-Shrek ist offline   Mit Zitat antworten
Alt 21.09.2006, 11:04   #2
Reg.-Benutzer
 
Reg.-Datum: 12.12.2005
Ort: Bremen
Standard

Hi,

eine Listbox hat keine Überschriften, meinst Du das ListView?
Laut MSDN sind die Columns für die Scrollfunktion.
__________________
Gruß

DevHB
DevHB ist offline   Mit Zitat antworten
Alt 21.09.2006, 11:18   #3
Registrierter Benutzer
 
Benutzerbild von IT-Shrek
 
Reg.-Datum: 06.01.2004
Ort: Hannover
Standard

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.
IT-Shrek ist offline   Mit Zitat antworten
Alt 21.09.2006, 11:23   #4
Reg.-Benutzer
 
Reg.-Datum: 12.12.2005
Ort: Bremen
Standard

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
DevHB ist offline   Mit Zitat antworten
Alt 21.09.2006, 11:45   #5
Registrierter Benutzer
 
Benutzerbild von IT-Shrek
 
Reg.-Datum: 06.01.2004
Ort: Hannover
Standard

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.
IT-Shrek ist offline   Mit Zitat antworten
Alt 21.09.2006, 11:55   #6
Reg.-Benutzer
 
Reg.-Datum: 12.12.2005
Ort: Bremen
Standard

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
DevHB ist offline   Mit Zitat antworten
Alt 21.09.2006, 13:00   #7
Registrierter Benutzer
 
Benutzerbild von IT-Shrek
 
Reg.-Datum: 06.01.2004
Ort: Hannover
Standard

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.
IT-Shrek ist offline   Mit Zitat antworten
Alt 21.09.2006, 13:15   #8
Reg.-Benutzer
 
Reg.-Datum: 12.12.2005
Ort: Bremen
Standard

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
Wobei "OptimizeWidth, LockWindowUpdate" nur Funktionen mit API Aufruf sind (erstmal nicht so wichtig).
__________________
Gruß

DevHB
DevHB ist offline   Mit Zitat antworten
Alt 21.09.2006, 13:16   #9
Reg.-Benutzer
 
Reg.-Datum: 12.12.2005
Ort: Bremen
Standard Sortieren

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
Aufruf im ColumnClick Event vom Listview:
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
DevHB ist offline   Mit Zitat antworten
Alt 22.09.2006, 07:05   #10
Registrierter Benutzer
 
Benutzerbild von IT-Shrek
 
Reg.-Datum: 06.01.2004
Ort: Hannover
Standard

Vielen Dank.

Shrek
__________________
Wissen ist der Gott, den ich verehre, und die Gesetze der Wissenschaft sind meine Religion.
IT-Shrek ist offline   Mit Zitat antworten
Alt 20.06.2008, 21:39   #11
Reg.-Benutzer
 
Reg.-Datum: 20.06.2008
Cool Listbox in VBA / Access sortieren bei Klick auf Header

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
Das Modul dazu gibts in meinem Blog:
Listbox in Access per Mausklick sortieren

Viel Spaß damit

Geändert von WernerMager (20.06.2008 um 21:41 Uhr)
WernerMager ist offline   Mit Zitat antworten
Antwort

Tags: , ,


Lesezeichen
Zurück   Forum Fachinformatiker.de > Programmierung > Basic

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


Alle Zeitangaben in WEZ +2. Es ist jetzt 23:22 Uhr.