IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Stockage de données dans un fichier binaire


Sujet :

Windows Forms

  1. #1
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut Stockage de données dans un fichier binaire
    Bonsoir les développeurs,

    bon voilà je suis sur un projet qui consiste à organiser des minis excursions et leurs étapes.

    J'ai une DataGridView dont la DataSource est une collection de mini excursions et cette dernière est stockée dans un fichier binaire à l'aide d'une classe qu'un de mes prof' a créé, voici le code de cette classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    class Persistance<T>
        {
            private string _nomFichier;
    
            public Persistance(string nomFichier)
            {
                _nomFichier = nomFichier;
            }
    
            public T charger()
            {
                T objet = Activator.CreateInstance<T>();
                if (System.IO.File.Exists(_nomFichier))
                {
                    FileStream fs = new FileStream(_nomFichier, FileMode.Open);
                    try
                    {
                        BinaryFormatter bf = new BinaryFormatter();
                        objet = (T)bf.Deserialize(fs);
                    }
                    catch (SerializationException se)
                    {
                        throw se;
                    }
                    finally
                    {
                        fs.Close();
                    }
                    return objet;
                }
                else return objet;
            }
    
            public void sauver(T unObjet)
            {
                FileStream fs = new FileStream(_nomFichier, FileMode.Create);
                try
                {
                    BinaryFormatter bf = new BinaryFormatter();
                    bf.Serialize(fs, unObjet);
                }
                catch (SerializationException se)
                {
                    throw se;
                }
                finally
                {
                    fs.Close();
                }
            }
        }
    Sur l'événement form_load de mon formulaire, j'utilise la procédure charger() pour remplir mon DataGridView, cependant quand je lance l'application, j'ai l'exception MissingMethodException qui est levée, voici l'erreur qu'il me sort :
    Aucun constructeur sans paramètre défini pour cet objet.
    Cette erreur est sur la ligne mise en gras dans ma classe Persistance.
    Au cas où, voici le code de mon formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public partial class Form1 : Form
        {
            private classMiniExcursion _mesMiniExc;
            private poo.Persistance<classMiniExcursion> _p;
     
            public Form1()
            {
                InitializeComponent();
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
                _p = new poo.Persistance<classMiniExcursion>("mesMiniExc.bin");
                _mesMiniExc = _p.charger();
                dgvMiniExc.DataSource = _mesMiniExc;
            }
     
            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                _p.sauver(_mesMiniExc);
            }
        }
    Merci d'avance.

    EDIT : la procédure charger() est utilisée sur l'événement form_load, pas closing. Je l'ai modifié dans le texte

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    La méthode Activator.CreateInstance crée un objet en appelant son constructeur par défaut (sans paramètre). Apparemment la classe classMiniExcursion que tu essaies de sérialiser n'a pas de constructeur par défaut...
    Pour détecter ce genre d'erreur à la compilation, il vaudrait mieux mettre une contrainte sur le paramètre de type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class Persistance<T> where T : new()
    (ce qui contraint le type T à avoir un constructeur par défaut)

    De toutes façons, l'instance créée par défaut ne sert à rien : elle est écrasée juste après par le résultat de la désérialisation. Le seul intérêt de faire comme ça est de ne pas renvoyer null en cas d'erreur, mais à mon avis il vaut mieux renvoyer null (ou la valeur par défaut du type T) et gérer ce cas en dehors de cette méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            public T charger()
            {
                T objet = default(T);
                if (System.IO.File.Exists(_nomFichier))
                {
                    ...
                }
                else return objet;
            }

  3. #3
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Merci, ça m'a permis de lancer mon appli'

    Cependant, j'ai pas pu remplir ma DGV (il n'y avait aucune colonne) et du coup en fermant l'appli', la procédure sauver de la classe Persistance a été appelée et à sauvegarder des trucs vides.

    Du coup quand je veux relancer l'appli', j'ai cette exception qui est levée :
    Tentative de désérialisation d'un flux vide.
    Que faire ? Merci.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par DarkSeiryu Voir le message
    Merci, ça m'a permis de lancer mon appli'
    Tu as fais comment ? contrainte sur le T ou initialisation de objet à default(T) ? Si tu as utilisé la 2e approche, il faut que tu vérifies la valeur de retour de charger et que tu l'initialises toi-même si ça a renvoyé null

    Citation Envoyé par DarkSeiryu Voir le message
    Cependant, j'ai pas pu remplir ma DGV (il n'y avait aucune colonne) et du coup en fermant l'appli', la procédure sauver de la classe Persistance a été appelée et à sauvegarder des trucs vides.

    Du coup quand je veux relancer l'appli', j'ai cette exception qui est levée :

    Que faire ? Merci.
    En fait tu as du créer un fichier vide : l'appel à Serialize a du planter car l'objet était null, mais le fichier avait déjà été ouvert. Il faut vérifier s'il est non null avant de sérialiser. Supprime le fichier vide pour te débloquer.

    Sinon, quelques remarques sur le code de Persistance :
    Selon les conventions de nommage en .NET, les membres publics s'écrivent avec une majuscule (pour être précis, en CamelCase, c'est à dire majuscule au début de chaque mot dans le nom)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                    catch (SerializationException se)
                    {
                        throw se;
                    }
    Ce genre de chose est à éviter, car ça réinitialise la pile et tu perds l'info sur l'origine de l'erreur (Voir ici). Il faut juste faire throw, pas throw se :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                    catch (SerializationException se)
                    {
                        throw;
                    }

  5. #5
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    On oublié la question qu'il y avait sur ce post.

    J'ai changé de technique. Pour que ma DGV ne soit pas vide, j'ai ajouté des get et set dans ma classMiniExcursion et créé un BindingSource de cette classe dans ma DGV.

    Cependant lorsque j'essaie de sauvegarder (c'est à dire lorsque que je quitte l'appli') j'ai une nouvelle exception qui est levée :
    Object Graph ne peut pas être null.
    Nom du paramètre : graph
    Sur la ligne en gras de la procédure sauver(T unObjet) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public void sauver(T unObjet)
            {
                    FileStream fs = new FileStream(_nomFichier, FileMode.Create);
                    try
                    {
                        BinaryFormatter bf = new BinaryFormatter();
                        bf.Serialize(fs, unObjet);
                    }
                    catch (SerializationException)
                    {
                        throw;
                    }
                    finally
                    {
                        fs.Close();
                    }
            }

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    C'est quoi le problème au juste ?
    Tel que je le vois, tu essaies de charger des données à partir d'un fichier, et si tu n'as pas pu les charger (fichier absent ou erreur), tu initialises toi-même l'objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            private void Form1_Load(object sender, EventArgs e)
            {
                _p = new poo.Persistance<classMiniExcursion>("mesMiniExc.bin");
                _mesMiniExc = _p.charger();
                if (_mesMiniExc == null)
                    _mesMiniExc = new classMiniExcursion(); // avec éventuellement des paramètres...
                dgvMiniExc.DataSource = _mesMiniExc;
            }
    En faisant ça tu es sûr que _mesMiniExc n'est jamais null

    C'est pas plus compliqué que ça...

  7. #7
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    J'ai ajouté ce que tu m'as dit, du coup je peux lancer et fermer l'appli' sans souci, merci

    Mais quand je lance l'appli', ma DGV est vide, il n'y a que le nom des colonnes et je ne peux pas rajouter de données (voir l'image ci-dessous) comme je souhaite le faire.

    Voici le code de ma classe MiniExcursion si ça aide à résoudre le problème... :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    [Serializable()]
        class classMiniExcursion
        {
            private int _numMiniExcursion;
            private string _libMiniExcursion;
            private int _nbPlaces;
            private List<classEtape> _lesEtapes;
     
            public int numMiniExcursion
            {
                get { return _numMiniExcursion; }
                set { _numMiniExcursion = value; }
            }
     
            public string libMiniExcursion
            {
                get { return _libMiniExcursion; }
                set { _libMiniExcursion = value; }
            }
     
            public int nbPlaces
            {
                get { return _nbPlaces; }
                set { _nbPlaces = value; }
            }
     
            public classMiniExcursion(int unNumMiniExcursion, string unLibMiniExcursion, int unNbPlaces, List<classEtape> desEtapes)
            {
                this._numMiniExcursion = unNumMiniExcursion;
                this._libMiniExcursion = unLibMiniExcursion;
                this._nbPlaces = unNbPlaces;
                this._lesEtapes = desEtapes;
            }
     
            public int donneDureePrevue()
            {
                int dureeTot = 0;
     
                foreach (classEtape etape in _lesEtapes)
                    dureeTot += etape.dureePrevue;
                return dureeTot;
            }
     
            public string donneDureePrevue_hhmm()
            {
                classTemps cs_tps = new classTemps();
                int dureeTot = this.donneDureePrevue();
                string hhmm = cs_tps.conversion_hhmm(dureeTot);
                return hhmm;
            }
     
            public bool ajouteEtape(int unNumEtape, string uneDescription, int uneDureePrevue)
            {
                bool verif = false;
                foreach (classEtape etape in _lesEtapes)
                {
                    if (etape.numEtape == unNumEtape)
                        verif = false;
                    else
                    {
                        classEtape cs_etape = new classEtape(unNumEtape, uneDescription, uneDureePrevue);
                        _lesEtapes.Add(cs_etape);
                        verif = true;
                    }
                }
                return verif;
            }
        }
    EDIT : le code de mon Form1 tant qu'à faire...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    public partial class Form1 : Form
        {
            private classMiniExcursion _mesMiniExc;
            private poo.Persistance<classMiniExcursion> _p;
     
            public Form1()
            {
                InitializeComponent();
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
                _p = new poo.Persistance<classMiniExcursion>("mesMiniExc.bin");
                if (_mesMiniExc == null) _mesMiniExc = new classMiniExcursion(1, "test", 25, null);
                else _mesMiniExc = _p.charger();
                dgvMiniExc.DataSource = _mesMiniExc;
            }
     
            private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                if (_mesMiniExc != null) _p.sauver(_mesMiniExc);
            }
        }

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par DarkSeiryu Voir le message
    (voir l'image ci-dessous)
    Euh... quelle image ?

    Le DGV est supposé afficher quoi ? la liste des étapes d'une excursion ? une liste d'excursions ? Si c'est ça _mesMiniExc devrait être une liste de classMiniExcursion, pas une classMiniExcursion...

  9. #9
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Oui tomlev je voudrais que ma DGV affiche tout ce que tu as dit (j'aurais peut-être du commencer par expliquer ça ^^).

    Et voilà l'image :
    Image

  10. #10
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    (Désolé pour le double post).

    J'ai changé, _mesMiniExc est devenue une List<classMiniExcursion>.

    Mais du coup il faut que je modifie la classe Persistance non ? Parce que il ne s'agit plus de T unObjet etc...

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par DarkSeiryu Voir le message
    (Désolé pour le double post).
    Tu peux utiliser le bouton Editer pour modifier un post

    Citation Envoyé par DarkSeiryu Voir le message
    Mais du coup il faut que je modifie la classe Persistance non ? Parce que il ne s'agit plus de T unObjet etc...
    Non, Persistance<T> est générique... il suffit de l'utiliser comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            private poo.Persistance<List<classMiniExcursion>> _p;
     
    ...
     
            private void Form1_Load(object sender, EventArgs e)
            {
                _p = new poo.Persistance<List<classMiniExcursion>>("mesMiniExc.bin");
                if (_mesMiniExc == null) _mesMiniExc = new List<classMiniExcursion>();
                else _mesMiniExc = _p.charger();
                dgvMiniExc.DataSource = _mesMiniExc;
            }
    Par contre, initialement la liste sera vide... il faut ajouter une interface pour pouvoir en saisir une nouvelle.

    Par ailleurs, tu devrais vraiment avoir un constructeur par défaut pour ta classe classMiniExcursion : s'il n'y en a pas, tu ne pourras pas utiliser le mode d'édition du DGV pour ajouter des nouvelles excursions, car le DGV ne saura pas comment créer une nouvelle instance de classMiniExcursion

  12. #12
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Cool ça marche, j'peux entrer des données dans la DGV ^^

    Mais par contre ça ne me les sauvegarde pas :/
    Ca me génère une exception qui me dit ça :
    Object Graph ne peut pas être null.
    Nom du paramètre : graph
    Il me la met sur la ligne bf.Serialize(fs, unObjet); de la procédure sauver(T unObjet) de la classe Persistance.

    J'y arriverai un jour xD

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par DarkSeiryu Voir le message
    Mais par contre ça ne me les sauvegarde pas :/
    Ca me génère une exception qui me dit ça :

    Object Graph ne peut pas être null.
    Nom du paramètre : graph
    Il me la met sur la ligne bf.Serialize(fs, unObjet); de la procédure sauver(T unObjet) de la classe Persistance.
    Bizarre
    C'est ça le code qui fait la sauvegarde ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (_mesMiniExc != null) _p.sauver(_mesMiniExc);
    parce que si c'est ça je vois pas comment c'est possible que tu aies cette erreur

  14. #14
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Oui c'est bien ça le code de la sauvegarde...

    EDIT : je rentre les données directement dans la DGV hein, je le fais pas à partir d'autre chose...

    EDIT 2 : en fait le fichier binaire n'est même pas créé... Je viens d'aller voir dans le dossier debug de mon appli', il n'y a aucun fichier binaire...

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par DarkSeiryu Voir le message
    Oui c'est bien ça le code de la sauvegarde...
    Tu es sûr que tu n'appelles pas la méthode sauver à un autre endroit ? par ce que soit _mesMiniExc est null, et dans ce cas la méthode n'est pas appelée, soit _mesMiniExc n'est pas null, et dans ce cas la méthode ne devrait pas planter...

    Citation Envoyé par DarkSeiryu Voir le message
    EDIT : je rentre les données directement dans la DGV hein, je le fais pas à partir d'autre chose...

    EDIT 2 : en fait le fichier binaire n'est même pas créé... Je viens d'aller voir dans le dossier debug de mon appli', il n'y a aucun fichier binaire...
    tu es sûr qu'il est pas créé ailleurs ? l'exception se produit pourtant après la création du fichier...

  16. #16
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Citation Envoyé par tomlev
    Tu es sûr que tu n'appelles pas la méthode sauver à un autre endroit ?
    Oui, certain !

    Citation Envoyé par tomlev
    par ce que soit _mesMiniExc est null, et dans ce cas la méthode n'est pas appelée
    C'est ça, j'ai mis un point d'arrêt, lors du closing le programme ne passe jamais par _p.sauver(_mesMiniExc);, il passe par if (_mesMiniExc != null) et ensuite l'appli' se ferme.

    Citation Envoyé par tomlev
    tu es sûr qu'il est pas créé ailleurs ? l'exception se produit pourtant après la création du fichier...
    Je ne le trouve nul part, quand je lance une recherche il ne m'affiche que Form1.cs ---> image.

    EDIT : si j'essaie d'enlever le test de vérification de _mesMiniExc à null, je me mange l'erreur du graph null sur la même ligne de la procédure sauver (bf.Serialize(fs, unObjet))...

    EDIT 2 : par contre dans le cas dont je parle dans l'EDIT 1, le fichier binaire est bien créé mais est à null du coup j'me mange l'exception de la tentative de désérialisation d'un flux vide lors du load ! J'suis paumé complet !

  17. #17
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par DarkSeiryu Voir le message
    EDIT : si j'essaie d'enlever le test de vérification de _mesMiniExc à null, je me mange l'erreur du graph null sur la même ligne de la procédure sauver (bf.Serialize(fs, unObjet))...
    Ah ok, donc dans le post #12 où tu disais que tu avais l'exception, tu avais supprimé ce test ? désolé mais tes explications sont vraiment confuses et j'ai du mal à te suivre...

    Si je comprends bien, quand tu passes dans le FormClosing _mesMiniExc vaut null... vu qu'il est initialisé dans le Load, la seule explication serait que tu le remets à null à un autre endroit du code...

    D'ailleurs, au passage je réalise qu'il y a une grosse connerie dans le Load (que j'ai d'ailleurs modifié sans voir l'erreur )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                if (_mesMiniExc == null) _mesMiniExc = new List<classMiniExcursion>();
                else _mesMiniExc = _p.charger();
    Ca n'a pas de sens de faire ça : au début _mesMiniExc vaut toujours null puisqu'il n'a pas été initialisé, donc tu ne passes jamais par _p.charger...
    il faut faire comme ça (avec un try/catch pour faire bonne mesure) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
                try
                {
                    _mesMiniExc = _p.charger();
                }
                catch(Exception ex)
                {
                    MessageBox.Show("Erreur !\n" + ex.ToString());
                }
                if (_mesMiniExc == null) _mesMiniExc = new List<classMiniExcursion>();

  18. #18
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Citation Envoyé par tomlev
    Si je comprends bien, quand tu passes dans le FormClosing _mesMiniExc vaut null... vu qu'il est initialisé dans le Load, la seule explication serait que tu le remets à null à un autre endroit du code...
    Ben pourtant non...

    Sinon j'ai fait les modif' que tu m'as dit de faire (avec le try/catch) et j'ai mis un point d'arrêt.
    Le programme passe bien par charger() cette fois, donc ça c'est bien mais ma DGV est de nouveau vide, j'ai juste le header avec le nom des colonnes, il m'est donc impossible d'ajouter des mini excursions...

    PS : désolé si mes explications ne sont pas toujours très claires, c'est vrai que j'essaie des trucs et parle du problème que je rencontre sans dire ce que j'ai essayé de faire...

  19. #19
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par DarkSeiryu Voir le message
    Ben pourtant non...
    Ben pourtant _mesMiniExc doit pas passer "automagiquement" à null...

    Tu veux pas envoyer un zip avec ton projet ? ça permettrait peut-être d'y voir plus clair...

  20. #20
    Membre actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Points : 275
    Points
    275
    Par défaut
    Euh il est en VS 2008, c'est bon pour toi ?

    EDIT : Bon j'le mets quand même des fois que tu te connectes demain matin et que t'aies un peu de temps à y consacrer...

    Merci en tout cas pour le temps que tu m'accordes c'est sympa

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Stockage de données dans des fichiers texte ou dans une base de données?
    Par Marc22 dans le forum Général Conception Web
    Réponses: 4
    Dernier message: 17/12/2010, 01h39
  2. Stockage de données dans un fichier binaire
    Par Dayodavor dans le forum MATLAB
    Réponses: 2
    Dernier message: 07/01/2010, 13h52
  3. Réponses: 4
    Dernier message: 04/04/2009, 20h10
  4. [VB.NET] insertion donnée dans un fichier binaire
    Par wolfazer dans le forum Windows Forms
    Réponses: 2
    Dernier message: 21/02/2008, 11h41
  5. Réponses: 10
    Dernier message: 19/06/2006, 19h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo