Sauvegarde d'une DataGridView

Rapakooti Messages postés 90 Date d'inscription mercredi 4 décembre 2002 Statut Membre Dernière intervention 18 mai 2018 - 19 juil. 2012 à 00:02
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 - 25 juil. 2012 à 14:04
Bonjour, je cherche a sauvegarder un DataGridView du prog que je suis en train de faire, je ne peut pas le faire en BDD, car en faite cette DataGridView contient une liste de fichier trouvé sur mon HDD avec une fonction recursive ( avec leger fige j'ai laisser tomber les thread pour l'instant, et je voudrait la sauvegarde pour evite un nouveau scanne

Je vois pas comment faire avec une serialization, avez vous deja fais ca et comment?

Merci


R A P A K O O T I

10 réponses

Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 656
19 juil. 2012 à 07:24
Bonjour,

il y a quelques jours il y a eu une discussion sur le sujet avec un export vers excel.

Tu peux aussi serializer en xml, ici un post sur la question.

Enfin tu peux écrire un csv ou un fichier taboulé, là un code.


Whismeril
0
Rapakooti Messages postés 90 Date d'inscription mercredi 4 décembre 2002 Statut Membre Dernière intervention 18 mai 2018
19 juil. 2012 à 11:10
Merci whismeril tu est toujours d'une grande aide, oui j'ai meme regarde http://www.ace-art.fr/wordpress/2010/04/27/tutorial-sur-la-serialisation-en-c/


Le souci est :
Je cromprend le process, j'ai plus de de mal a l'applique a une datagridview...
Ma datagridview contient 3 colonnes : 1 colonne bool qui verifier la presence d'un NFO , et deux string,avec en premier un emplacement ( repertoire) et en deuxieme le nom du fichier. dois je creer une class comme dans l'exemple avec par exemple deux champs string et la modifier des que je touche au datagried et serialize la class? pour la presense du NFO sera verifier au chargement de l'application plus sur :-)



R A P A K O O T I
0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 656
19 juil. 2012 à 14:59
dois je creer une class comme dans l'exemple avec par exemple 


Pour le xml oui, si tu veux faire du csv pas obligé.

Pour le xml tu te crées effectivement une classe (maClasse) avec deux strings, mets quand même le booléen. Tu stockes le resultat de ton scan dans une List<maClasse> (maListe). Pour l'affichage tu affectes la liste au datasource du datagridview.
Pour ne pas serialiser le booléen (avec xmlserializer) il faut lui mettre l'attribut XmlIgnore:

        [XmlIgnore()]
        public bool MonBool
        {
            get
            {
                ...
            }
            set
            {
                ...
            }



        }

Whismeril
0
Rapakooti Messages postés 90 Date d'inscription mercredi 4 décembre 2002 Statut Membre Dernière intervention 18 mai 2018
19 juil. 2012 à 15:28
Merci ca me met deja sur la vois je vois ca se soir merci bcp

R A P A K O O T I
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Rapakooti Messages postés 90 Date d'inscription mercredi 4 décembre 2002 Statut Membre Dernière intervention 18 mai 2018
25 juil. 2012 à 00:20
Rebonjour, me revoila j'avance petit a petit mais j'ai un souci voila ou j'en suis j'ai créé une classe
using System;
using System.Xml;
using System.Xml.Serialization;


namespace WindowsFormsApplication1
{
    public class sauvegardefilm
    {
        private string _NFO = "Unknow";
        private string _emplacement = "Unknow";
        private string _fichier = "Unknow";
    

        /// ------------------------------------------------------------------------------------------------
        /// <summary>
        /// Constructeur sans paramètre obligatoire pour que l'object soit Serializable !
        /// </summary>
        /// ------------------------------------------------------------------------------------------------
        public sauvegardefilm()
        {
        }

        #region Pas Intéressant (Autres Ctor)

        public sauvegardefilm(string NFO, string emplacement, string fichier)
        {
            this._NFO = NFO;
            this._emplacement = emplacement;
            this._fichier = fichier;
        }

        #endregion

        
     [XmlElement("NFO")]
        /// <summary>
        /// Cette property est publique et sera donc serializée.
        /// </summary>
        /// ------------------------------------------------------------------------------------------------
        public string presNFO
        {
            get { return this._NFO; }
            set { this._NFO = value; }
        }
        [XmlElement("Repertoire")]

        public string Rep
        {
            get { return this._emplacement; }
            set { this._emplacement = value; }
        }  
          [XmlElement("NOMFICHIER")]
        public string Fich
        {
            get { return this._fichier; }
            set { this._fichier = value; }
        }

}
}


je rempli une liste a l'ajout d'un items dans le datagridview

 // On créer une collection de personnes.
            List<sauvegardefilm> listefilm = new List<sauvegardefilm>(3);
            try
            {
                foreach (string f in Directory.GetFiles(sDir, pattern))
                {
                    bool skipFile = false;
                    foreach (string item in filtre)
                    {
                        if (f.ToUpper().IndexOf(item.ToUpper()) != -1)
                        {
                          
                            skipFile = true;
                        }
                    }
                    if (!skipFile)
                    {
                        if (File.Exists(f.Substring(0, f.LastIndexOf(".")) + ".nfo"))
                        {
                          dataGridView1.Rows.Add(true, f.Substring(0, f.LastIndexOf("\") + 1), f.Substring(f.LastIndexOf("\") + 1));
                          listefilm.Add(new sauvegardefilm("oui", f.Substring(0, f.LastIndexOf("\") + 1),f.Substring(f.LastIndexOf("\") + 1)));
                        }
                        else
                            dataGridView1.Rows.Add(false, f.Substring(0, f.LastIndexOf("\") + 1), f.Substring(f.LastIndexOf("\") + 1));
                       }
                }
                foreach (string d in Directory.GetDirectories(sDir))
                {
                    DirSearch(d, pattern);
                }
            }
            catch (System.Exception excpt)
            {
                MessageBox.Show(excpt.Message);
            }

            Configurations cfg = new Configurations();
            cfg.person = listefilm; // On y set notre collection de personne.
        }


Je precise je part de cette source

la

Je comprend pas encore tout je pense comme le fait de cree une classe expres pour ca mais ca vient petit a petit par contre je compare pas moi C# me reconnait pas configurations, alors que dans le source d'origine pas de souci
R A P A K O O T I
0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 656
25 juil. 2012 à 07:19
Bonjour,

d'abord rapidement
dataGridView1.Rows.Add(true, f.Substring(0, f.LastIndexOf("\") + 1), f.Substring(f.LastIndexOf("\") + 1));
listefilm.Add(new sauvegardefilm("oui", f.Substring(0, f.LastIndexOf("\") + 1),f.Substring(f.LastIndexOf("\") + 1)));
 

Il ne faut pas faire ça, là tu remplis deux collections différentes avec tes données, du coup quand tu changes une données dans l'une rien ne se passe dans l'autre.
Dans cette boucle, remplit la List<T>, et après le scan de ton ordi, tu affectes la liste à la propriété DataSource du DataGridView c'est du Binding. Là il n'y a qu'une collection, et les modifications sont prises en compte. Dans le cas ou tu voudrais aller un peu plus loin dans ce concept regarde ce tuto.

Pour ton soucis avec Configuration, tu n'as pas posté le code, comme il faut l'adapter à ta source ça aurait été mieux. Le seul truc que je peux imaginer comme ça:
cfg.person = listefilm

person est bien du type List<sauvegardefilm>?
Whismeril
0
Rapakooti Messages postés 90 Date d'inscription mercredi 4 décembre 2002 Statut Membre Dernière intervention 18 mai 2018
25 juil. 2012 à 08:15
Autant pour moi pour
Configurations cfg = new Configurations();
            cfg.person = listefilm; // On y set notre collection de personne.

enf ait il faut cfg.sauvegardefilm = listefilm;

mais en fait c est le configurations qui n'est pas reconnu j'ai le droit a un beau message d'erreur
Erreur 1 Le type ou le nom d'espace de noms 'Configurations' est introuvable (une directive using ou une référence d'assembly est-elle manquante ?) E:\Dropbox\Programmation Csharp\Premier programme\Lister film\Filmeur\Filmeur\Form1.cs 139 2 Filmeur

R A P A K O O T I
0
Rapakooti Messages postés 90 Date d'inscription mercredi 4 décembre 2002 Statut Membre Dernière intervention 18 mai 2018
25 juil. 2012 à 09:10
Mais j'avoue que ma premiere methode etait plus simple , j'ai reussi une seule fois a avoir des info avec le Binding en se moment j'ai fait les modif que tu m'as conseillé, et j'en suis la
  private void DirSearch(string sDir, string pattern)
        {
            try
            {
                // On créer une collection de personnes.
                List<sauvegardefilm> listefilm = new List<sauvegardefilm>(3);
                foreach (string f in Directory.GetFiles(sDir, pattern))
                {
                    bool skipFile = false;
                    foreach (string item in filtre)
                    {
                        if (f.ToUpper().IndexOf(item.ToUpper()) != -1)
                        {
                          
                            skipFile = true;
                        }
                    }
                    if (!skipFile)
                    {
                        if (File.Exists(f.Substring(0, f.LastIndexOf(".")) + ".nfo"))
                        {

                            //    dataGridView1.Rows.Add(true, f.Substring(0, f.LastIndexOf("\") + 1), f.Substring(f.LastIndexOf("\") + 1));
                            listefilm.Add(new sauvegardefilm("oui", f.Substring(0, f.LastIndexOf("\") + 1), f.Substring(f.LastIndexOf("\") + 1)));
                        }
                        else
                        {
                            listefilm.Add(new sauvegardefilm("non", f.Substring(0, f.LastIndexOf("\") + 1), f.Substring(f.LastIndexOf("\") + 1)));
                        }
                        //    dataGridView1.Rows.Add(false, f.Substring(0, f.LastIndexOf("\") + 1), f.Substring(f.LastIndexOf("\") + 1));
                     }
                }
                foreach (string d in Directory.GetDirectories(sDir))
                {
                    DirSearch(d, pattern);
                }
            }
            catch (System.Exception excpt)
            {
                MessageBox.Show(excpt.Message);
            }
            dataGridView1.DataSource = sauvegardefilmBindingSource;
            
        }



Le seul resultat est a la fin du scann de l'ajout de colonne dans le datagridview vide qui corresponde aux colonnes de sauvegarde mais vide en plus, je continu se soir :-(

R A P A K O O T I
0
Rapakooti Messages postés 90 Date d'inscription mercredi 4 décembre 2002 Statut Membre Dernière intervention 18 mai 2018
25 juil. 2012 à 11:31
ahhh ca avance grace a un de tes tutos whismeril

j'avais pas bien indiqué le datasource "dataGridView1.DataSource = listefilm;"
Mais j'ai du mal declarer listefilm je me fis a ton tuto ca devais marche mais j'ai le message
Erreur 1 Impossible de convertir implicitement le type 'System.Collections.Generic.List<WindowsFormsApplication1.sauvegardefilm>' en 'System.Windows.Forms.BindingSource' E:\Dropbox\Programmation Csharp\Premier programme\Lister film\deuxieme sauvegarde Filmeur 25072012\Filmeur\Form1.cs 143 42 Filmeur


R A P A K O O T I
0
Whismeril Messages postés 19029 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 26 avril 2024 656
25 juil. 2012 à 14:04
Alors pour ça:
mais en fait c est le configurations qui n'est pas reconnu j'ai le droit a un beau message d'erreur
Erreur 1 Le type ou le nom d'espace de noms 'Configurations' est introuvable

dans ta classe configurations, le namesapce doit être différent de celui
de la classe ou tu scannes ton disque.

(une directive using ou une référence d'assembly est-elle manquante ?)
Il y a deux solutions, soit tu changes le namespace de l'un ou l'autre soit dans la classe de scan tout en haut tu écrits
Using NameSpaceDeLAutre;



Pour là:
'System.Collections.Generic.List<WindowsFormsApplication1.sauvegardefilm>' en 'System.Windows.Forms.BindingSource'

Attention l'utilisation de l'objet bindingSource entraine que le DataSource des objets associés soit lié à cet objet.
Donc c'est à la propriété DataSource de cet objet qu'il faut affecter la list.

Dans les cas de Binding simples (un seul controle d'affichage) on peut se passer de cet objet.

Whismeril
0
Rejoignez-nous