2010-08-07 6 views
0

Comment sérialiser et désérialiser mon formulaire principal (et ses contrôles, sous-contrôles, leurs valeurs, etc.)?Comment sérialiser et désérialiser un formulaire?


Modifier, pour clarification. Actuellement, j'écris la valeur actuelle de chaque contrôle dans un fichier .INI, un par un, et je le relis quand le programme est exécuté. Chaque fois que j'ajoute un nouveau contrôle, je dois me rappeler de mettre à jour ce code .INI de sauvegarde/chargement. Je me demandais juste si je peux le faire en un seul appel, ou une simple boucle pour itérer sur tous les contrôles sur le formulaire. Btw, je n'utilise que des contrôles simples comme la boîte d'édition, le bouton radio, la combo, la checkbox listbox, la chose la plus complexe que j'ai est une grille de données, mais qui n'est pas liée à une base de données.


réponse acceptée « ne peut pas. Je coderez probablement mon propre, le long des lignes de ...

pour chaque contrôle enfant (recursivley)

if conrol is editbox ... 

if control is radiobutton ... 

if ... etc 
    write control name to .ini file 
    write control "value" to .ini file 

peut-être ajouter plus tard à gauche/top/height/width/enabled/visible, etc, bu tfor pas le nom de l'econtrol et sa "valeur" sont suffisantes (texte, valeur, lignes, coché ?, etc)

+1

Pourriez-vous donner un peu plus d'informations sur ce que vous essayez de faire? Essayez-vous simplement de sauvegarder l'état de la forme entre les exécutions de votre programme? – CoderDennis

+1

oui, c'est exactement ça – Mawg

Répondre

6

Il n'y a pas de hors-de-la- boîte de support pour la sérialisation des formulaires .NET et con trols. Les contrôles ne sont pas marqués avec l'attribut [Serializable].

Je pense que la plupart des problèmes concernent les contrôles .NET qui sont en réalité des wrappers de contrôles natifs Win32. Persister l'état natif comme XML, il semble, serait infaisable.

Peut-être que quelqu'un a écrit un sérialiseur personnalisé; sinon, vous devrez peut-être rouler le vôtre.

Edit:

Je trouve cette réponse décourageante acceptée sur experts exchange:

Vous devez mettre en œuvre ISerializable ou IXmlSerializable afin de faire quelque chose comme ça (selon la façon dont pensez-vous vouloir sérialiser le formulaire). Ce n'est pas trivial.

3

Sérialiser l'ensemble contrôle semble être une proposition difficile. Cependant, si vous voulez sérialiser les données dans ce contrôle, c'est certainement possible, en supposant que vous l'ayez bien structuré.

Par exemple, disons que vous avez un objet Person avec un List de Address pour votre application Carnet d'adresses:

Public Class Person 
    Public Property PersonName As String 
    Public Property PersonAge As Integer 
    Public Property Addresses As New List(Of Address)() 
End Class 

Public Class Address 
    Public Property StreetAddress As String 
    Public Property City As String 
    Public Property State As String 
    Public Property Zip As String 
End Class 

Si vous liez ces données à votre formulaire, vous pouvez facilement sérialisation et la désérialisation à et de XML.Pour sérialiser:

Imports System.Xml.Serialization '<==you need to import this namespace ' 
'...' 

Dim thisPerson As New Person() 
Dim serializer = new XmlSerializer(thisPerson.GetType()) 
Using writer = XmlWriter.Create("thisPerson.xml")) 
    serializer.Serialize(writer, thisPerson) 
End Using 

désérialiser:

Dim thisPerson As New Person() 
Dim serializer As New XmlSerializer(thisPerson.GetType()) 
Using reader = XmlReader.Create("thisPerson.xml") 
    thisPerson = CType(serializer.Deserialize(reader),Person) 
End Using 

j'ai appris sur la sérialisation XML de this answer à une question que j'avais déjà demandé. Accordé, si vous chargez/extrayez manuellement des données à partir de vos formulaires, cela ne fonctionnera pas. I bonne idée pourrait être d'encapsuler vos données sous-jacentes pour un formulaire dans une classe, puis lier cette classe au formulaire. De cette façon, vous pouvez facilement sérialiser/désérialiser les données dans le formulaire.

Questions connexes