vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Top-Preis! AP-Access-Tools-CD Volume 1  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik: Controls · ListView & TreeView   |   VB-Versionen: VB2005, VB200802.10.09
ListView-Inhalt in Datei speichern und wieder auslesen

Zwei Funktionen, mit denen sich der gesamte Inhalt eines ListView-Controls als (Text-)Datei speichern und wieder einlesen lässt.

Autor:   Dieter OtterBewertung:     [ Jetzt bewerten ]Views:  19.842 
www.tools4vb.deSystem:  Win2k, WinXP, Win7, Win8, Win10, Win11 Beispielprojekt auf CD 

Das ListView-Control - ein Steuerelement, welches aufgrund seiner vielfältigen Einsatzmöglichkeit sehr häufig in den eigenen Projekten verwendet wird - bietet so einiges, doch leider fehlen zwei sehr wichtige Funktionen:

  • Speichern des gesamten Daten-Inhaltes
  • Einlesen und Anzeigen gespeicherter Daten

Speichern des ListView-Inhalts in eine Datendatei
Nachfolgende Funktion speichert den gesamten Inhalt des ListView-Controls zeilenweise in die angegebene Datendatei. Die einzelnen Spaltenwerte werden hierbei durch ein Tabulator-Zeichen getrennt gespeichert.

''' <summary>
''' Speichert den Inhalt des ListViews in eine Datei.-
''' </summary>
''' <param name="lvw">ListView-Control</param>
''' <param name="DataFile">Dateiname der Datendatei</param>
''' <returns>True, bei Erfolg, andernfalls False.</returns>
Public Function lvw_SaveData(ByVal lvw As ListView, ByVal DataFile As String) As Boolean
  Dim oStream As IO.StreamWriter = Nothing
  Dim bResult As Boolean = False
  Try
    ' Anzahl ListView-Spalten
    Dim lvwCols As Integer = lvw.Columns.Count
    Dim sData As New System.Text.StringBuilder
 
    With lvw.Items
      ' ListView durchlaufen und zeilenweise zusammensetzn
      For i As Integer = 0 To .Count - 1
        sData.Append(.Item(i).Text)
        For u As Integer = 1 To lvwCols - 1
          sData.Append(vbTab & .Item(i).SubItems(u).Text)
        Next 
        sData.AppendLine()
      Next 
    End With
 
    ' Stream-Objekt zum Speichern erstellen
    ' und den zuvor zusammengestellen String speichern
    oStream = New IO.StreamWriter(DataFile, False, System.Text.Encoding.Default)
    oStream.Write(sData.ToString)
    oStream.Flush()
    bResult = True
 
  Catch ex As Exception
 
  Finally
    ' Stream-Objekt schließen
    If Not IsNothing(oStream) Then oStream.Close()
  End Try
 
  Return (bResult)
End Function

Einlesen und Anzeigen der gespeicherten Daten
Und nun noch die Funktion, mit der sich die Datendatei wieder auslesen und im ListView anzeigen lässt.
Ich habe hierzu eine überladene Funktion erstellt, bei der man optional angeben kann, ob der bisherige Inhalt im ListView-Control vorher gelöscht werden soll oder nicht.

''' <summary>
''' Füllt das ListView mit den Datenzeilen der angegebenen Datei.
''' </summary>
''' <param name="lvw">ListView-Control</param>
''' <param name="DataFile">Dateiname der Datendatei</param>
''' <returns>True, bei Erfolg, andernfalls False.</returns>
Public Function lvw_ReadData(ByVal lvw As ListView, ByVal DataFile As String) As Boolean
  Return lvw_ReadData(lvw, DataFile, True)
End Function
''' <summary>
''' Füllt das ListView mit den Datenzeilen der angegebenen Datei.
''' </summary>
''' <param name="lvw">ListView-Control</param>
''' <param name="DataFile">Dateiname der Datendatei</param>
''' <param name="AppendData">True, wenn die Daten angehängt werden sollen.
''' False, wenn das ListView vorher gelöscht werden soll.</param>
''' <returns>True, bei Erfolg, andernfalls False.</returns>
Public Function lvw_ReadData(ByVal lvw As ListView, ByVal DataFile As String, _
  ByVal AppendData As Boolean) As Boolean
 
  Dim bResult As Boolean = False
 
  ' Existiert die Datei?
  If IO.File.Exists(DataFile) Then
    ' Datei vollständige einlesen und in einzelne Zeilen aufsplitten
    Dim sLines() As String = My.Computer.FileSystem.ReadAllText( _
      DataFile, System.Text.Encoding.Default).Split(Environment.NewLine.ToCharArray)
 
    ' Anzahl ListView-Spalten
    Dim lvwCols As Integer = lvw.Columns.Count
 
    lvw.BeginUpdate()
 
    ' ggf. ListView löschen
    If Not AppendData Then lvw.Items.Clear()
 
    ' Jetzt die Datenzeilen in das ListView übertragen
    For i As Integer = 0 To sLines.Length - 1
      If sLines(i).Length > 0 Then
        Dim sData() As String = sLines(i).Split(vbTab)
 
        ' Falls die Anzahl Datenspalten nicht mit der Anzahl Spalten 
        ' im ListView übereinstimmen, -> Array "zurechtrücken"
        If sData.Length < lvwCols Then ReDim Preserve sData(lvwCols - 1)
 
        With lvw.Items.Add(sData(0))
          For u As Integer = 1 To lvwCols - 1
            .SubItems.Add(sData(u))
          Next 
        End With
      End If
    Next 
 
    lvw.EndUpdate()
    bResult = True
  End If
 
  Return (bResult)
End Function

Dieser Tipp wurde bereits 19.842 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Aktuelle Diskussion anzeigen (5 Beiträge)

nach obenzurück


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.
 
   

Druckansicht Druckansicht Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle 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.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel