Rubrik: Datenbanken · Sonstiges | VB-Versionen: VB6 | 07.04.03 |
ListView-Inhalt in der Datenbank speichern Zwei Funktionen, mit denen sich der Inhalt eines ListView-Control in einer Datenbank speichern und wieder auslesen lässt. | ||
Autor: Dieter Otter | Bewertung: | Views: 17.160 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | kein Beispielprojekt |
Unser heutiger Tipp zeigt einen Weg, wie sich der Inhalt eines ListView-Controls in einer Datenbank speichern und auch wieder auslesen lässt. Neben dem reinen Text sollen aber auch alle Zusatzinformationen, wie Farbattribute und Bildsymbol-Index gespeichert werden.
Da das ListView sehr viele Zeile und Spalten enthalten kann, lässt sich der gesamte Inhalt meist nicht in einem Standard Datenbank-Textfeld speichern. Wir benötigen also ein Datenbank-Feld, das sehr viele Informationen aufnehmen kann - ein Memofeld.
Der Inhalt des ListView-Controls muss hierzu zunächst in einen einzigen String zusammengefasst werden, der dann im Memofeld der Datenbank-Tabelle gespeichert werden kann:
Private Function db_lvwGetData(ListView As ListView) As String Dim oItem As ListItem Dim i As Integer Dim sData As String sData = "" With ListView For Each oItem In .ListItems ' 1. Spalte With oItem sData = sData & CStr(Abs(.Bold)) & _ CStr(Abs(.Checked)) & "|" & _ CStr(.Icon) & "|" & CStr(.SmallIcon) & "|" & _ CStr(.ForeColor) & "|" & .Key & "|" & .Text End With ' weitere Spalten For i = 1 To oItem.ListSubItems.Count With oItem.ListSubItems.Item(i) sData = sData & vbTab & _ CStr(Abs(.Bold)) & "|" & _ CStr(.ReportIcon) & "|" & _ CStr(.ForeColor) & "|" & .Text End With Next i ' nächste Zeile sData = sData & vbCrLf Next End With db_lvwGetData = sData End Function
Das Speichern des ListView-Inhaltes erfolgt demnach wie folgt:
With oRecordset ... .Fields("memofeld").Value = db_lvwGetData(ListView1) ... End With
Fehlt jetzt nur noch die Funktion, um den gespeicherten Inhalt wieder im ListView-Control anzuzeigen:
Private Sub db_lvwSetData(ListView As ListView, _ ByVal dbData As String) Dim sLine() As String Dim sData() As String Dim sCol() As String Dim i As Integer Dim u As Integer Dim oItem As ListItem Dim oSubItem As ListSubItem With ListView ' ListView löschen .ListItems.Clear ' In die einzelnen Zeilen "zerlegen" sLine = Split(dbData, vbCrLf) ' alle Zeilen nacheinander hinzufügen For i = 0 To UBound(sLine) - 1 ' Spalten-Infos If sLine(i) <> "" Then sData = Split(sLine(i), vbTab) ' 1. Spalte sCol = Split(sData(0), "|") Set oItem = .ListItems.Add(, , sCol(5)) With oItem If sCol(4) <> "" Then .Key = sCol(4) .ForeColor = Val(sCol(3)) .SmallIcon = Val(sCol(2)) .Icon = Val(sCol(1)) .Bold = (Val(Mid$(sCol(0), 1, 1)) <> 0) .Checked = (Val(Mid$(sCol(0), 2, 1)) <> 0) End With ' weitere Spalten For u = 1 To UBound(sData) sCol = Split(sData(u), "|") Set oSubItem = oItem.ListSubItems.Add(, , sCol(3)) With oSubItem .Bold = (Val(sCol(0)) <> 0) .ReportIcon = Val(sCol(1)) .ForeColor = Val(sCol(2)) End With Next u End If Next i End With End Sub
Für das Auslesen und Anzeigen, folgende Codezeile verwenden:
With oRecordset ... db_lvwSetData ListView1, .Fields("memofeld").Value ... End With