Rubrik: Controls · ListView | VB-Versionen: VB5, VB6 | 19.11.07 |
ListView-Einträge nach oben/unten verschieben Mit diesem Code lässt sich ein kompletter ListView-Eintrag innerhalb der Liste nach oben bzw. nach unten verschieben. | ||
Autor: Dieter Otter | Bewertung: | Views: 11.035 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Immer wieder taucht die Frage auf, wie sich ein ListView-Eintrag um eine Position nach oben bzw. nach unten verschieben lässt. Eine Möglichkeit wäre sich alle Einstellungen des aktuell selektierten ListView-Eintrags zu merken, dann das ListItem-Objekt aus der Liste zu löschen und an der gewünschten Position neu einzufügen.
Fügen Sie Ihrem Projekt zunächst nachfolgende Klasse hinzu und benennen Sie diese "lvItem". Durch Aufruf der "Save"-Prozedur merkt sich die Klasse alle Eigenschaften des übergebenen ListView-Items einschl. der SubItems-Objekte. Anschließend kann man den Eintrag im ListView löschen. Danach fügt man dem ListView an der gewünschten Position einen neuen Eintrag hinzu und ruft anschließend die "Restore"-Prozedur der Klasse mit dem neu hinzugefügten ListItem-Objkekt auf.
Klasse "lvItem"
Option Explicit ' Eigenschaften des ListItem-Objekts Private m_Bold As Boolean Private m_Checked As Boolean Private m_ForeColor As Long Private m_Ghosted As Boolean Private m_Icon As Long Private m_Key As String Private m_SmallIcon As Long Private m_Tag As Variant Private m_Text As String Private m_ToolTipText As String Private m_ListSubItemsCount As Long Private m_SubItems() As SubItem ' Eigenschaft der einzelnen SubItem-Objekte Private Type SubItem Bold As Boolean ForeColor As Long Key As String ReportIcon As Long Tag As Variant Text As String ToolTipText As String End Type
' Speichern aller Eigenschaften des übergebenen ListItem-Objekts Public Sub Save(oItem As MSComctlLib.ListItem) Dim i As Long With oItem m_Text = .Text m_Key = .Key m_Icon = .Icon m_SmallIcon = .SmallIcon m_Checked = .Checked m_Bold = .Bold m_ForeColor = .ForeColor m_Ghosted = .Ghosted m_ToolTipText = .ToolTipText m_Tag = .Tag m_ListSubItemsCount = .ListSubItems.Count ReDim m_SubItems(m_ListSubItemsCount) For i = 1 To .ListSubItems.Count With .ListSubItems(i) m_SubItems(i).Bold = .Bold m_SubItems(i).ForeColor = .ForeColor m_SubItems(i).Key = .Key m_SubItems(i).ReportIcon = .ReportIcon m_SubItems(i).Tag = .Tag m_SubItems(i).Text = .Text m_SubItems(i).ToolTipText = .ToolTipText End With Next i End With End Sub
' Wiederherstellen der "gespeicherten" Eigenschaften Public Function Restore(oItem As MSComctlLib.ListItem) Dim i As Long With oItem .Text = m_Text .Key = m_Key .Icon = m_Icon .SmallIcon = m_SmallIcon .Checked = m_Checked .Bold = m_Bold .ForeColor = m_ForeColor .Ghosted = m_Ghosted .ToolTipText = m_ToolTipText .Tag = m_Tag For i = 1 To m_ListSubItemsCount If .ListSubItems.Count < i Then .ListSubItems.Add With .ListSubItems(i) .Bold = m_SubItems(i).Bold .ForeColor = m_SubItems(i).ForeColor .Key = m_SubItems(i).Key .ReportIcon = m_SubItems(i).ReportIcon .Tag = m_SubItems(i).Tag .Text = m_SubItems(i).Text .ToolTipText = m_SubItems(i).ToolTipText End With Next i End With End Function
Nachfolgend der Code zum Verschieben des aktuell selektierten ListView-Eintrags um eine Position nach oben:
' aktuellen ListView-Eintrag eine Position nach oben Dim Index As Long Dim oItem As ListItem Dim lvItem As New lvItem With ListView1 Index = .SelectedItem.Index If Index > 1 Then ' alle Eigenschaften "merken" lvItem.Save .SelectedItem ' Eintrag löschen .ListItems.Remove Index ' Eintrag 1 Position weiter oben wieder einfügen Set oItem = .ListItems.Add(Index - 1) ' ursprüngliche Eigenschaften wiederherstellen lvItem.Restore oItem End If End With
Und jetzt noch der Code zum Verschieben des aktuell selektierten Eintrags um eine Position nach unten:
' aktuellen ListView-Eintrag eine Position nach unten Dim Index As Long Dim oItem As ListItem Dim lvItem As New lvItem With ListView1 Index = .SelectedItem.Index If Index < .ListItems.Count Then ' alle Eigenschaften "merken" lvItem.Save .SelectedItem ' Eintrag löschen .ListItems.Remove Index ' Eintrag 1 Position weiter unten wieder einfügen Set oItem = .ListItems.Add(Index + 1) ' ursprüngliche Eigenschaften wiederherstellen lvItem.Restore oItem End If End With