2009-11-03 7 views
1

J'ai travaillé sur une application qui permet à l'utilisateur de créer un modèle d'étiquette pour l'impression en ajoutant des contrôles d'étiquette à un panneau (que j'utilise comme un conteneur). J'ai atteint le point où je dois être en mesure d'enregistrer le modèle dans un fichier que je peux charger dans la mémoire plus tard pour l'impression. Puisque le formulaire n'est pas sérialisable, quelqu'un a-t-il des suggestions sur la façon dont je peux sauvegarder le formulaire ou le conteneur (avec des contrôles d'étiquette ajoutés) dans un fichier qui peut être réutilisé plus tard?Enregistrer WinForm ou des contrôles dans un fichier

Merci.

Répondre

2
  1. Créer une struct qui contient suffisamment d'informations (et plus) sur chaque Label que vous pouvez reconstituer le Label de celui-ci. Ecrivez une méthode qui prend un List<MyStruct> et remplit un Panel de vos structures.

  2. Écrire des méthodes pour sérialiser et désérialiser cette liste.

  3. Encapsuler le tout dans une classe.

+0

C'est exactement ce que je pense après avoir lu la réponse d'OG. Merci! – Nathan

+0

J'ai tout codé et ça fonctionne parfaitement maintenant. Merci beaucoup à tous. – Nathan

1

Personnellement, je le sérialiserais en tant que JSON. Lorsque vous le ramenez, vous pouvez utiliser une méthode générique qui boucle et définit les propriétés par réflexion. Notez également que la bibliothèque à laquelle je suis lié met automatiquement en série les objets que vous lui transmettez.

JSON

JSON.NET

[{ "Label": [{"Top": 102}, {"Left": 105}, {"Text": "blah, blah"}] }] 

De JSON.NET

Product product = new Product(); 
product.Name = "Apple"; 
product.Expiry = new DateTime(2008, 12, 28); 
product.Price = 3.99M; 
product.Sizes = new string[] { "Small", "Medium", "Large" }; 

string json = JsonConvert.SerializeObject(product); 
//{ 
// "Name": "Apple", 
// "Expiry": new Date(1230422400000), 
// "Price": 3.99, 
// "Sizes": [ 
// "Small", 
// "Medium", 
// "Large" 
// ] 
//} 

Product deserializedProduct = JsonConvert.DeserializeObject<Product>(json); 
+0

Jamais utilisé JSON mais je ne suis pas opposé à l'apprentissage de nouvelles choses. – Nathan

0

Vous pouvez obtenir la position, la taille et d'autres propriétés au sujet les contrôles de formulaire lors de l'exécution et enregistrer cet état dans un fichier XML ou JSON.

1

Ce n'est pas trivial, mais personnellement je voudrais mettre en place une fonction qui peut être appelée récursivement qui ajouterait des noeuds à un fichier XML.

Je n'ai pas de code réel, mais pseudo-code ressemble à ceci: (vous aurez besoin de faire un peu de nettoyage, parce que je le fais sur le dessus de ma tête sans l'aide d'Intellisense.)

XmlDocument doc; 

function SaveForm() 
{ 
    doc = new XmlDocument("FormInfo"); 
    foreach(Control ctrl in this.Controls) 
    { 
     AddControlToXml(ctrl, doc.Documentelement); 
    } 
} 

function AddControlToXml(Control ctrl, XmlNode currentNode) 
{ 
    XmlNode n = new XmlNode; 
    Node.InnerText = ctrl.Name; 
    foreach(Control ctrl2 in ctrl.Controls) 
    { 
     AddControlToXml(ctrl2); 
    } 

} 
+0

On dirait C# pour moi. (Sauf pour la déclaration de fonction JavaScript.) – ChaosPandion

+0

Je ne vois pas la récursivité ici ... c'est l'itération de premier niveau – jmayor

+0

bien à deux niveaux d'itération .. vous n'irez pas plus loin que le premier conteneur .. – jmayor

4

Je ne sérialiserais pas directement un formulaire dans un fichier. Il semble que vous ayez besoin de créer une classe qui contiendra l'état du travail de l'utilisateur. Vous devez ensuite sérialiser cette classe vers et depuis un fichier. Il y a des méthodes intégrées pour cela en utilisant Binary ou XML Serialization.

+0

@Nathan: Notez que si vous utilisez cette méthode, vous devez créer vos contrôles dynamiquement en fonction des données présentes dans la classe d'état. –

+0

Ce ne serait probablement pas un problème. Je voudrais juste obtenir les informations de propriété importantes de chaque contrôle, puis sérialiser le fichier correct? – Nathan

Questions connexes