Nicht serialisierbare List(OF ..) - Problem

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Henk36.

    Nicht serialisierbare List(OF ..) - Problem

    Hallo!

    Ich habe die bestehenden Beiträge im Forum gesehen, aber sie beantworten meine Frage leider nicht.

    Ich habe in einer Klasse eine LIST(OF Label). Die Instanzen der Klasse sollen gespeichert und gelanden werden können. Klappt auch alles.

    Die genannte LIST(OF Label) ist nicht serialisierbar, aufgrund der Label-Objekte. Kein Problem: die Liste wird auf <NonSerialized()> gesetzt. (Ich brauch die Daten aus der Liste nicht zwingend nach dem Laden der Instanz.)

    ABER: Nach dem Laden kann auf die Liste nicht mal mehr zugegriffen werden. Das ist ein Problem.



    Hab ich n Denkfehler drin???? :cursing:






    Ergänzung: Eine nicht serialisirte Eigenschaft der Klasse, die z.B. ein String oder Integer ist, steht nach dem Laden als Eigenschaft wieder zur Verfügung ... warum nicht die Liste????



    hmmm ...

    Die Liste ist praktisch (vielleicht keine gute Struktur - mag sein).

    Jede Klasseninstanz hat eine Liste von Label, die sich auf verschiedenen Forms befinden. Um bei einer instanzinternen Änderung die Label nicht in allen Forms unter allen Controls jedesmal heraussuchen zu müssen, dachte ich, dass sich eine Liste der zur Instanz gehörenden Label anbietet.

    Eine Serialisieren der Liste hab ich ja auch nicht vor. ABER ich versteh nicht warum ein Zugriff in den wieder geladenen Instanzen nicht mehr möglich ist.

    Ich lade die gespeicherten Instanzen. Dadurch kann sich doch die Klasse selber nicht verändern ... oder????? ?(


    Laden der Instanzen der Klassse "Raum":

    VB.NET-Quellcode

    1. If TypeOf Objekt Is Raum Then
    2. Dim c As New Raum
    3. c = CType(O, Raum)

    Wie kann hier die in der Klassse angelegte Liste verschwinden?!?!




    "sc_Listitems" ist die besagte LIST(OF ...)

    Henk36 schrieb:

    Jede Klasseninstanz hat eine Liste von Label, die sich auf verschiedenen Forms befinden. Um bei einer instanzinternen Änderung die Label nicht in allen Forms unter allen Controls jedesmal heraussuchen zu müssen, dachte ich, dass sich eine Liste der zur Instanz gehörenden Label anbietet.
    Du hast das Rad neu erfunden! :thumbsup:

    Aber guck dir lieber an, was vor dir bereits als Rad herausgekommen ist: Nämlich Databinding.

    gugge vier Views-Videos fürnen kleinen Einblick.

    Allerdings hast du als SpezialProblem noch formübergreifendes Databinding. Dazu habich kein spezielles Tut, das ist eher etwas angepatcht zb an Viele DbSamples

    Aber auch ohne die Form-Übergreifende Variante ist das Thema erstmal reichlich Lernpensum.
    Und für automatische Serialisierung: Neben DataBinding solltest du nur eine List(Of Tuple(Of String, String)) speichern, wobei die Tupel-Elemente Name des Labels (ggf. auch FormName.LabelName bei Mehrdeutigkeiten) und Label-Text sind. Die Liste wird per Serialisierung geladen und gespeichert. Nach dem Laden gehst du sie durch und bindest jeweils Item2 an das Ziel, das in Item1 des Tupels steht. Speichern und automatische Aktualisierung bekommst du dabei geschenkt.
    Gruß
    hal2000
    Danke für die Antworten.

    Warum das passiert, was passiert, weiß ich leider immer noch nicht :O(



    Wird mit Deine Tutorielles mal anschauen. Auf den ersten Blick sehe ich den Zusammenhang zwischen Databinding und meinem Problem nicht ... aber as kommt ja vielleicht noch.



    LG
    bei Databinding feuern die Datensätze ein Event, wenn sie geändert werden.
    gebundene Controls reagieren auf dieses Event, und zeigen den geänderten Wert an.
    Das kann auch Form-Übergreifend stattfinden, also du kannst 10 Forms haben mit je ein Label, was an denselben Datensatz gebunden ist. Wird der Datensatz geändert, ändert sich auch die Label-Anzeige auf allen Forms.
    Mir scheint, dassis, was du mit deiner Label-Liste auch erreichen willst.

    Databinding funzt mit Labels, Textboxen, Listboxen und ganzen Tabellen, und es ergeben sich darüber hinaus erstaunliche neue Möglichkeiten.

    Ach so - und abgespeichert wird nicht per Serialisierung, sondern typisiertes Dataset hat eine eigene Speicher-Methode.
    Ok!

    Ich habe eine Fehler gemacht. SORRY! Ich habe den Proplemsachverhalt versucht so einfach zu beschreiben, wie es geht - und habe daher ein Control (nämlich Label) in meiner Problembeschreibung genannt, dass nicht serialisierbar ist (und damit auch nicht eine Liste des Controls.

    Im konkreten Fall geht es um eine Liste von Items in einer GroupedNavigationBar von elegant. Die Items repräsentieren Räume. Das Item-Image verdeutlich, ob der Raum verplant ist. Jeder Raum ist eine Klasseninstanz der Klasse "Räume".
    In verschiedenen Fenstern tritt eine GroupedNavigationBar mit allen Raum Items auf. Die Fenster repräsentieren unterschiedliche Tag und sind Child-Forms. Zusätzlich sind die NavigationBars halt gruppiert, d.h. jede NavigationBar in jedem Fenster hat mehrere Gruppen (Arbeitsraum, Aufenthaltsraum, ..). Ein Raum, kann ich mehreren Gruppen auftauchen.



    Um nicht die Übersicht zu verlieren welche GroupedNavigationBar-Items alle zu einem Raum (Instanz der Klasse "Raum") gehören, habe ich jeder Instanz ihre Items als Objekte in der besagten Liste übergeben.

    (Wird z.B. ein raum verplant, ändert sich sein Satus und die Images der Items des Raums ändern sich alle.)

    Das funktioniert ja auch alles. Ein Speichern der LIST(OF GroupedNavigationBarItems) ist nicht nötig, weil sie beim Laden wieder neu zugewiesen werden können/müssen.

    ABER, dass ein Zugriff auf die - in der Klasse definierten Liste - nach dem Laden nicht mehr möglich ist, ist natürlich ein dickes Problem. ... und mir vollkommen unverständlich :O(



    Nachtrag: Die Items in einem Dataset zu referenzieren, ist sicherlich möglich, ... ist das der "professionelle Weg"????

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Henk36“ ()

    professionell ist, ein Datenmodell zu basteln, und dann eine Oberfläche dafür.

    ein Datenmodell kannman ganz gut mit einem typisierten Dataset basteln, und dabei den Dataset-Designer als ER-Modell-Tool verwenden.
    Dazu muß man halt kapiert haben, was relationale Datenmodellierung bedeutet, und die Regeln, nach denen so ein Modell zu strukturieren ist.

    Kurz gesagt: Das Modell muß der Realität entsprechen, und es dürfen keine Redundanzen auftreten.
    Konkreter: die relationale GrundIdee
    Danke für den Hinweis!



    Mein eigentliches Problem habe ich inzwischen gelöst. Vielleicht interessiert es ja noch Suchende:

    Ein nicht mit-serialisiertes Attribut (hier: sc_Listitems ) einer Klasse, kann wieder implementiert werden nach dem Laden der Klasse, indem die Klasse eine entsprechende Anweisung enthält:

    VB.NET-Quellcode

    1. <OnDeserializing()>
    2. Friend Sub OnDeserializingMethod(ByVal context As StreamingContext)
    3. sc_Listitems = New System.Collections.Generic.List(Of ----)
    4. End Sub


    LG