vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Erstellen von dynamischen Kontextmen?s - wann immer Sie sie brauchen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Serialisierung 
Autor: Schü
Datum: 03.09.08 19:04

Hallo nochmal!

Kann mann ein gefülltes ListView-Element mit allen Items und Subitems inkl. der Spaltenbreiten oder Icons ohne weiteres in eine Datei serialisieren, um es z.B. per Button wieder aus einer Datei zu laden? Im Prinzip ein leeres Listview per Code aus einer Datei füllen, die vorher von einem Anderen ListView abgespeichert wurde.

Oder geht das nur Schritt für Schritt? Also ColumnHeaderCollection auslesen und anlegen, Items auslesen und anlegern etc.....

Schü
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Serialisierung 
Autor: icetea123
Datum: 03.09.08 19:41

Das ganze auf einmal Serialisieren macht keinen Sinn, da z.B. die Parent Eigenschaft nicht serialisiert werden kann. Aber wenn du einzeln die Collections (l.Items, l.Coloumns, l.Groups usw) serialisierst müsste es klappen (Richtige Reihenfolge beachten, beim schreiben erst Coloumns dann Groups, dann Items, beim Lesen erst Coloumns, dann Groups, dann Items)

MfG,
icetea

-----------------------------------
Betriebssystem: Schrott (Vista)
Entwicklungsumgebung: VS 2008

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Serialisierung 
Autor: Schü
Datum: 03.09.08 19:58

Hmm...

Das dachte ich.

Kannst Du mir ein Grundgerüst empfehlen, wie mann z.B. die ColumnHeaderCollection schreibt und liest?

Schü
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Serialisierung 
Autor: keco
Datum: 03.09.08 20:14

Du kannst dir selbst eine Klasse schreiben, in denen du die benötigten Propertys hast (in dem Falle die genannten 3) und anschließend diese Klasse serialisierst.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Serialisierung 
Autor: Schü
Datum: 03.09.08 21:03

Hast du ein kurzes Beispiel??
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Serialisierung 
Autor: Schü
Datum: 03.09.08 22:20

Wie kann man diese 3 Klassen denn hintereinander in die selbe Datei schreiben?
Das kann man doch nicht wieder auslesen, da die Werte der klassen doch immer verschieden sind? oder?

Schü
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Serialisierung 
Autor: keco
Datum: 04.09.08 00:24

Du erstellst eine Klasse mit den nötigen Eigenschaften (das Beispiel hat nur die ListViewItems; ColumnHeader und ListViewGroup musst du noch selbst hinzufügen):
<System.Serializable()> _
Public Class MyListViewSources
   Private pItems As ListViewItem()
 
   Public Sub New(ByVal Items As ListViewItem())
      pItems = Items
   End Sub
 
   Public Property Items() As ListViewItem()
      Get
         Return Me.pItems
      End Get
      Set(ByVal value As ListViewItem())
         Me.pItems = value
      End Set
   End Property
 
   Public Sub Save()
      Dim fs As New IO.FileStream(Application.UserAppDataPath & "\lvdata.dat", _
        IO.FileMode.Create)
      Dim formatter As New _
      System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
 
      Try
         formatter.Serialize(fs, Me)
      Catch ex As Exception
         MsgBox(ex.Message)
      Finally
         fs.Close()
      End Try
   End Sub
 
   Public Shared Function Load() As MyListViewSources
      Dim fs As New IO.FileStream(Application.UserAppDataPath & "\lvdata.dat", _
        IO.FileMode.Open)
      Dim formatter As New _
      System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
 
      Try
         Return DirectCast(formatter.Deserialize(fs), MyListViewSources)
      Catch ex As Exception
         MsgBox(ex.Message)
         Return Nothing
      Finally
         fs.Close()
      End Try
   End Function
End Class
Die Klasse muss als Serializable eingestellt werden und schon steht dem Speichern und Laden nichts mehr im Wege.

Speichern und Laden kannst du wie folgt:
Public Class Form2
   Private lvSources As MyListViewSources
 
   ' Speichern
   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _
     System.EventArgs) Handles Button1.Click
      ' Array von ListViewItem erstellen
      Dim arr(ListView1.Items.Count - 1) As ListViewItem
      ' Items aus dem ListView in das Array kopieren
      ListView1.Items.CopyTo(arr, 0)
 
      ' Neue Instanz erstellen und Array übergeben
      lvSources = New MyListViewSources(arr)
      ' Speichern
      lvSources.Save()
   End Sub
 
   ' Laden
   Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As _
     System.EventArgs) Handles Button2.Click
      ' Laden
      lvSources = MyListViewSources.Load()
 
      ' Jedes Item in das ListView hinzufügen, ggf. ListView1.Items.Clear() 
      ' aufrufen
      For Each item As ListViewItem In lvSources.Items
         ListView1.Items.Add(item)
      Next
   End Sub
End Class
Das sollte dann alles so funktionieren.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Serialisierung 
Autor: Schü
Datum: 04.09.08 08:44

OK.

Danke für die ausführliche Hilfe!
Ich schau mir das mal in Ruhe an.

Schü
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Serialisierung 
Autor: Schü
Datum: 04.09.08 16:58

Hi!

Wenn ich das richtig verstehe, erzeugst du ein Klasse, die eine Kopie der Listviewitems als array 'beherbergt' und diese Klasse wird dann durch das NET Framework serialisiert. Das ganze von ausserhalb der ListView-Klasse OK. Klar soweit.

Ich habe 2 Fragen dazu:

1.) kann mann diese Klasse/Funktionen (Load/Save) auch direkt als Funktion der Listview-Klasse implementieren?
Ich habe nähmlich eine eigene ListView-Klasse, die vom NET-Steuerelement vererbt ist und weitere Funktionen hat. Ich hätte gern so oder so ähnlich aufgerufen:
myListView.Load() und myListView.Save()
und alles dann intern in der Klasse abwickeln. Das müsste doch gehen, da in meinem ListView auch die ColumnHeaderCollection und die ListViewItemCollection vererbt sind, könnte man doch diese Collections auch gleich als serialisierbar kennzeichnen und serialisieren??

2.) Ich möchte diese Daten alle in eine Datei schreiben. Also wenn ich nun die Items gespeichert habe würden zunächst die ColumnHeader folgen (oder umgekehrt) und dann die Groups etc. ...
Ich sehe nur nicht wie ich hinereinander mehrere Objekte in die selbe Datei schreibe (und wieder lesen kann)

Schü
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Serialisierung 
Autor: icetea123
Datum: 04.09.08 18:41

Ja das geht.
Das gleiche wie oben beschrieben, nur mit Me.* statt mit list.*


MfG,
icetea

-----------------------------------
Betriebssystem: Schrott (Vista)
Entwicklungsumgebung: VS 2008

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Serialisierung 
Autor: Schü
Datum: 04.09.08 19:42

OK, Danke!

und Frage 2?


Schü
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Serialisierung 
Autor: keco
Datum: 05.09.08 18:59

Frage 1.) Wenn du dein eigenes ListView hast, welches von ListView erbt, dann kannst du die Funktionen integrieren und entsprechend, wie icetea123 schrieb, umändern.

Frage 2.) Die Daten werden alle schon in eine Datei geschrieben, binär. Wenn du die Columns und Groups auch speichern willst, dann lege einfach nur die entsprechenden Properties an und ruf die .Save bzw. .Load-Methode auf.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

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