2012-11-18 5 views
1

Je suis sûr que c'est une question très noob-ish, mais j'ai cherché cette information depuis deux heures et je n'ai rien trouvé, vraiment. (Je suis sûr que je n'ai pas posé la bonne question, cependant.)Traitement des informations à partir des formulaires

Le truc, c'est que je suis en train de concevoir une application qui demande à un utilisateur de fournir beaucoup d'informations, je pense que c'est comme 14 TextBox. Maintenant, mon problème est que je ne suis pas sûr de la meilleure façon de gérer (et de traiter) cette information. Après avoir obtenu tout cela d'un utilisateur, je veux le passer à une classe appelée SaveIt qui l'utilise puis passe à SerializeToXML, qui utilise XMLSerialize pour enregistrer les informations dans un fichier XML. Mais c'est beaucoup d'écriture et beaucoup de variables à créer et je suis sûr que cela peut être fait d'une manière plus élégante et plus intelligente. Pour récapituler: Je dois passer cette information 2 fois (une fois à SaveIt, puis à SerializeToXML), plus je dois définir une classe que XMLSerialize utilisera, bien ... sérialiser.

Quelle est la manière la plus intelligente de faire cela?

Répondre

1

Un moyen serait de simplement passer l'original Form comme paramètre Puis obtenez l'information quand vous en avez vraiment besoin. Mais alors ces méthodes seront codées en dur pour ce travail, et vous ne serez pas en mesure de les réutiliser.

Alors, que diriez-vous de créer une classe avec ces variables, et en passant une instance de cette classe?

public class TextBoxesInformation 
{ 
    public string box1string; 
    public string box2string; 
    //... 
} 
+0

C'est le meilleur moyen de, cependant. Ce n'est peut-être pas une réponse directe à ma question, mais elle m'a montré ce qui n'allait pas dans ma pensée. Je voulais être capable de transmettre des données facilement entre les classes. La meilleure chose à faire est de créer une classe qui stockerait toutes les informations dont j'avais besoin, leur assigner des valeurs correctes dès le début et ensuite réutiliser l'objet. Encore beaucoup d'écriture, mais quand j'ai réécrit le code, ça s'est avéré être le chemin à parcourir. Je vous remercie. :) – moskalak

1

Vous devriez rendre votre classe SaveIt sérialisable. Le XML Serializer enregistre uniquement les propriétés.

[Serializable] 
public class SaveIt 
{ 
    public string Text1 {get; set;} 
    public string Text2 {get; set;} 
    ... 
} 

private void Save(string filename) 
{ 
    SaveIt save = new SaveIt(); 
    save.Text1 = textBox1.Text; 
    ... 

    using(Stream stream = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.Write)) 
    { 
     XmlSerializer xmlserializer = new XmlSerializer(typeof(SaveIt)); 
     xmlserializer.Serialize(stream, save); 
    } 
} 

private void Load(string filename) 
{ 
    SaveIt load; 
    using(Stream stream = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read)) 
    { 
     XmlSerializer xmlserializer = new XmlSerializer(typeof(SaveIt)); 
     load = xmlserializer.Deserialize(stream) as SaveIt; 
    } 

    textBox1.Text = load.Text1; 
    textBox2.Text = load.Text2; 
    ... 
} 

Mais je crains qu'il n'y ait pas de moyen facile de copier des données à partir de formulaire à la classe SaveIt.

+0

Le '[Serializable]' attribut n'est pas nécessaire pour la sérialisation XML –

+0

Ce n'est pas vraiment ce que je cherchais, mais merci vous avez fourni ce morceau de code, ça m'a aidé un peu. :) – moskalak

0

Une approche est d'utiliser la liaison de données. Vous devez ajouter à la zone de texte la liaison de données, la propriété de votre objet SaveIt, et cela remplit automatiquement votre propriété lorsque l'utilisateur écrit dans la zone de texte.

Vous pouvez ajouter ceci dans le constructeur du formulaire pour chaque propriété.

SaveIt saveIt = new SaveIt(); 
textBoxFirstName.DataBindings.Add("Text", saveIt.FirstName, "FirstName"); 
textBoxLastName.DataBindings.Add("Text", saveIt.LastName, "LastName"); 

et vous devez implémenter l'interface INotifyPropertyChanged dans votre classe SaveIt comme ceci:

public class SaveIt : INotifyPropertyChanged { 


    public event PropertyChangedEventHandler PropertyChanged; 

    private string _firstName = string.Empty; 
    private string _lastName = string.Empty; 

    public string FirstName { 
     get { return _firstName; } 
     set { 
      _firstName = value; 
      OnPropertyChanged("FirstName"); 
     } 
    } 

    public string LastName { 
     get { return _lastName; } 
     set { 
      _lastName = value; 
      OnPropertyChanged("LastName"); 
     } 
    } 

    private void OnPropertyChanged(string propertyName) { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

L'utilisation de ce que vous n'avez pas besoin de remplir toutes les propriétés manuellement

Ensuite, vous pouvez utiliser l'approche de Casperah pour sérialiser l'objet SaveIt

+0

C'est une belle façon. J'ai besoin de lire plus sur la databiding, cependant. Je vous remercie. :) – moskalak

1

je l'ai déjà écrit une réponse, mais peut-être le principal point de votre question était différente donc voici une réponse à un autre aspect de la question.

Peut-être quelque chose comme:

foreach (Control ctrl in Controls) 
    if (ctrl is TextBox) 
     dictionary.Add((ctrl as TextBox), (ctrl as TextBox).Text); 

Où:

Dictionary<TextBox, string> dictionary = new Dictionary<TextBox, string>(); 
+0

Oui, c'est un bon moyen, merci. :) – moskalak

Questions connexes