Tipp 0087 ListBox-Einträge speichern und einlesen
Autor/Einsender:
Datum:
  M. Werner / T. Becker
08.10.200
5/08.10.2009
Entwicklungsumgebung:   VB.Net 2003/05
Framework:   1.1 / 2.0
Da u.a. die Methoden IO.File.WriteAllLines, IO.File.ReadAllLines sowie Items.Contains zur Prüfung auf Doppeleinträge im Framework 1.1 nicht verfügbar sind und in VB 2003 das Framework 2.0 nicht eingebunden werden kann, beinhaltet dieser Tipp zusätzlich eine Variante ab VB 2005.
VB 2003 - Framework 1.1
Mit den Klassen IO.StreamWriter und IO.StreamReader kann der Inhalt einer Listbox in einer Textdatei gespeichert und wieder ausgelesen werden. Über jeweils eine Schleife wird itemweise in die Datei gespeichert und zeilenweise aus der Datei wieder ausgelesen. Weiterhin wird demonstriert, wie einer Listbox Einträge hinzugefügt und über ein Kontextmenü (rechte Maustaste) wieder gelöscht werden können.
 
Public Class Form1
  Inherits System.Windows.Forms.Form
Vom Windows Form Designer generierter Code
  Private sFile As String = System.IO.Path.Combine _
        (Application.StartupPath, "Liste.dat")

  Private Sub SaveListbox(ByVal ListBox As ListBox, _
        ByVal sFile As String)

    Dim writer As IO.StreamWriter
    Dim i As Short

    writer = New IO.StreamWriter(sFile)

    For Each item As Object In ListBox1.Items
      writer.WriteLine(ListBox.Items(i))
      i += 1
    Next

    writer.Close()
  End Sub

  Private Sub ReadListbox(ByVal ListBox As ListBox, _
        ByVal sFile As String)

    Dim reader As IO.StreamReader
    Dim sLine As String

    ListBox.Items.Clear()

    Dim oFile As New IO.FileInfo(sFile)
    If oFile.Exists() = True Then
      reader = New IO.StreamReader(sFile)
      Do
        sLine = reader.ReadLine()
        If IsNothing(sLine) Then Exit Do
        ListBox.Items.Add(sLine)
      Loop
      reader.Close()
    End If
  End Sub

  Private Sub Form1_Load(ByVal sender As System.Object, _
         ByVal e As System.EventArgs) Handles MyBase.Load
    With ListBox1
      .Items.Add("Arnie Müller")
      .Items.Add("Peter Pankrat")
      .Items.Add("Annelise Netrowic")
    End With
  End Sub

  Private Sub Button1_Click(ByVal sender As System.Object, _
          ByVal e As System.EventArgs) Handles Button1.Click
    SaveListbox(ListBox1, sFile)
  End Sub

  Private Sub Button2_Click(ByVal sender As System.Object, _
          ByVal e As System.EventArgs) Handles Button2.Click
    ReadListbox(ListBox1, sFile)
  End Sub

  Private Sub MenuItem1_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MenuItem1.Click

    If ListBox1.SelectedIndex() <> -1 Then
      ListBox1.Items.RemoveAt(ListBox1.SelectedIndex())
    Else
      MessageBox.Show("Bitte den zu löschenden Eintrag " & _
            zuerst markieren!", "Eintrag markieren", _
            MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
    End If

  End Sub
End Class
 
VB 2005 - Framework 2.0
Ziel dieses gleichnamigen Tipps ist es, das seit Framework 2.0 mögliche Speichern und Einladen von Textdateien durch ein komplettes Stringarray aufzuzeigen. Die Verarbeitung erfolgt somit in "einem Rutsch", was gerade bei größeren Inhalten einen Geschwindigkeitsvorteil bringt.
Weiterhin wird hier gezeigt, wie sich Doppeleinträge durch eine .Contains-Abfrage vermeiden lassen. Der Tipp verfügt über ein ContextMenuStrip, womit durch rechte Maustaste auf ListBox ein selektierter Eintrag gelöscht werden kann.
 
Public Class Form1
  ' Der Speicherort der Textdatei
  Private FILENAME As String = IO.Path.Combine _
          (Application.StartupPath, "Liste.dat")

  Private Sub SaveListbox(ByVal ListBox As ListBox, _
          ByVal sFile As String)
    ' Inhalt einer ListBox speichern
    With ListBox1.Items
      ' Alle Inhalte aus ListBox ins Stringarray bringen
      Dim strArr(.Count - 1) As String
      .CopyTo(strArr, 0)

      ' Array In Textdatei speichern
      IO.File.WriteAllLines(sFile, strArr)
    End With
  End Sub

  Private Sub ReadListbox(ByVal ListBox As ListBox, _
          ByVal sFile As String)
    ' Vorhandenen ListBox-Inhalt löschen
    ListBox.Items.Clear()

    ' Existsiert die Datei?
    If IO.File.Exists(sFile) = True Then
      ' Inhalt einer Datei in ListBox einlesen
      Dim strArr() As String = IO.File.ReadAllLines(sFile)
      ListBox.Items.AddRange(strArr)
    End If
  End Sub

  Private Sub Form1_Load(ByVal sender As System.Object, _
          ByVal e As System.EventArgs) Handles MyBase.Load
    ' ListBox beim Anwendungstart füllen
    Dim strPersonen() As String = {"Arnie Müller", "Peter Pankrat",_
        "Annelise Netrowic"}
    ListBox1.Items.AddRange(strPersonen)
  End Sub

  Private Sub Button1_Click(ByVal sender As System.Object, _
          ByVal e As System.EventArgs) Handles Button1.Click
    ' ListBox speichern
    SaveListbox(ListBox1, FILENAME)
  End Sub

  Private Sub Button2_Click(ByVal sender As System.Object, _
          ByVal e As System.EventArgs) Handles Button2.Click
    ' ListBox einlesen
    ReadListbox(ListBox1, FILENAME)
  End Sub

  Private Sub Button3_Click(ByVal sender As System.Object, _
          ByVal e As System.EventArgs) Handles Button3.Click
    ' Inhalt der Listbox löschen
    ListBox1.Items.Clear()
  End Sub

  Private Sub Button4_Click(ByVal sender As System.Object, _
          ByVal e As System.EventArgs) Handles Button4.Click
    If CheckBox1.Checked Then
      ' Doppeleinträge verhindern (Contains)
      If Not ListBox1.Items.Contains(TextBox1.Text) Then
        ' Eintrag hinzufügen
        ListBox1.Items.Add(TextBox1.Text)
      Else
        MessageBox.Show("Eintrag schon vorhanden!", _
            "Doppeleinträge werden nicht zugelassen.", _
            MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
      End If
    Else
      ' Eintrag hinzufügen (Doppelte zulassen)
      ListBox1.Items.Add(TextBox1.Text)
    End If
  End Sub

  Private Sub Button5_Click(ByVal sender As System.Object, _
          ByVal e As System.EventArgs) Handles Button5.Click
    ' Applikation beenden
    Me.Close()
  End Sub

  Private Sub MarkiertenEintragLöschenToolStripMenuItem_Click(ByVal _
          sender As System.Object, ByVal e As System.EventArgs) _
          Handles MarkiertenEintragLöschenToolStripMenuItem.Click
    ' Markierten Eintrag in Listbox löschen
    ' über das Contextmenu (rechte Maustaste)
    If ListBox1.SelectedIndex() <> -1 Then
      ListBox1.Items.RemoveAt(ListBox1.SelectedIndex())
    Else
      MessageBox.Show("Bitte den zu löschenden Eintrag zuerst"_
             "markieren!", "Eintrag markieren", _
             MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
    End If
  End Sub
End Class
 
Weitere Links zum Thema
ListBox numerisch sortieren
Doppeleinträge in Combo-/ ListBox verhindern
ListBox-Einträge verschieben
Mehrspaltige ListBox

Windows-Version
98/SE
ME
NT
2000
XP
Vista
Win 7


Download  (21,1 kB) Downloads bisher: [ 935 ]

Vorheriger Tipp Zum Seitenanfang Nächster Tipp

Startseite | Tipps | Projekte | Tutorials | Bücherecke | VB-/VBA-Tipps | API-Referenz | Komponenten | VB.Net-Forum | VB/VBA-Forum | DirectX-Forum | Foren-Archiv | DirectX | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report
Letzte Aktualisierung: Donnerstag, 26. Januar 2012