vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Controls · ListView   |   VB-Versionen: VB5, VB619.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 OtterBewertung:  Views:  11.035 
www.tools4vb.deSystem:  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



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.