Sauvegarde d'une DataGridView

Signaler
Messages postés
92
Date d'inscription
mercredi 4 décembre 2002
Statut
Membre
Dernière intervention
18 mai 2018
-
Messages postés
15137
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
24 novembre 2020
-
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

Messages postés
15137
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
24 novembre 2020
462
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
Messages postés
92
Date d'inscription
mercredi 4 décembre 2002
Statut
Membre
Dernière intervention
18 mai 2018

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
Messages postés
15137
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
24 novembre 2020
462
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
Messages postés
92
Date d'inscription
mercredi 4 décembre 2002
Statut
Membre
Dernière intervention
18 mai 2018

Merci ca me met deja sur la vois je vois ca se soir merci bcp

R A P A K O O T I
Messages postés
92
Date d'inscription
mercredi 4 décembre 2002
Statut
Membre
Dernière intervention
18 mai 2018

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
Messages postés
15137
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
24 novembre 2020
462
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
Messages postés
92
Date d'inscription
mercredi 4 décembre 2002
Statut
Membre
Dernière intervention
18 mai 2018

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
Messages postés
92
Date d'inscription
mercredi 4 décembre 2002
Statut
Membre
Dernière intervention
18 mai 2018

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
Messages postés
92
Date d'inscription
mercredi 4 décembre 2002
Statut
Membre
Dernière intervention
18 mai 2018

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
Messages postés
15137
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
24 novembre 2020
462
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