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

C# Discussion :

[C#] Cannot access a disposed object


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juin 2007
    Messages
    359
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 359
    Par défaut [C#] Cannot access a disposed object
    Bonjour,
    J'ai une form FEnrouleuse qui s'ouvre très bien, et qui lorsque je la ferme, puis la réouvre, me sort un "Cannot access a disposed object", alors même que je l'ai recréé,...

    Voila mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if(FEnrouleuse == null)
                        FEnrouleuse = new FEnrouleuse(this, 0);
                    FEnrouleuse.Width = (this.Width - (3 * hSpace))*2 / 3;
                    FEnrouleuse.Height = (this.Height - (6 * vSpace));
                    FEnrouleuse.Visible = true;
                    FEnrouleuse.Location = new Point(0, 0);                                FEnrouleuse.Visible = true;
                    FEnrouleuse.Show();
    Et mon bug se produit à chaque fois sur FEnrouleuse.Visible ou FEnrouleuse.Show(); (le premier rencontré)
    Il semblerait que lors de la destruction, je dispose quelque chose qu'il ne reconstruit pas ensuite,...

    Voila donc le OnClosed de ma Form FPlanning, dont hérite FEnrouleuse:
    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
    private void FPlanning_FormClosed(object sender, FormClosedEventArgs e)
            {
                this.Dispose();
                switch (TypeFen())
                {  
                    case 0: FormMain.GetInstance().SetNullFenr();
                        break;
                    case 1: FormMain.GetInstance().SetNullFVis();
                        break;
                    case 2: FormMain.GetInstance().SetNullFWaitenr();
                        break;
                    case 3: FormMain.GetInstance().SetNullFWaitVis();
                        break;
                }
            }
    Et ce que font les SetNull c'est ça:
    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
    public void SetNullFenr()
            {
                FEnrouleuse = null;
            }
            public void SetNullFWaitVis()
            {
                FWaitVis = null;
            }
            public void SetNullFVis()
            {
                FVisseuse = null;
            }
            public void SetNullFWaitenr()
            {
                FWaitEnr = null;
            }
    Donc, rien de très bizarre, je ne comprends pas d'où est ce que sort cette exception,...
    Je Dispose bien u objet, et ensuite j'en recréé un autre!

    Merci de votre aide

  2. #2
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Par défaut
    Histoire d'être sûr et de ne pas chercher des heures vers une mauvaise voie : tu as essayé en supprimant tout simplement le if pour tester si ta fenêtre a déjà instanciée ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(FEnrouleuse == null)
    Ainsi, la fenêtre sera réinstanciée à chaque fois et si le problème persiste, on va pouvoir explorer d'autres solutions.

  3. #3
    Rédacteur
    Avatar de Paul Musso
    Profil pro
    Inscrit en
    Août 2008
    Messages
    368
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Août 2008
    Messages : 368
    Par défaut
    Qu'elle est la ligne qui plante exactement ?
    Cela ne vient t-il pas d'un autre objet ?

  4. #4
    Membre éclairé
    Inscrit en
    Juin 2007
    Messages
    359
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 359
    Par défaut
    Heu, le problème, c'est que je ne veux pas réinstancier ma fenêtre, sinon, elle va faire un ReadData, et là, je perds les modifs faites par l'utilisateur et je reprends les data de la bdd,
    Quand à savoir l'objet qui plante, si j'ai bien vu, c'est l'objet "Enrouleuse", un UserControl, mais pourtant, je peux y avoir accès ( je dis que je peux y avoir accès car dans le Watch Debug, ces Enrouleuses de ma FEnrouleuse sont bien là).

    Je n'ai aucune idée de comment faire,...

    La ligne qui plante est : FEnrouleuse.Visible = true;
    Et il me dit que cela provient de mon UserControl Enrouleuse, que FEnrouleuse contient bien,...
    Il semblerait que le Dispose() se soit mal adapté à mes UserControl, peut-être que je devrais faire un override de Dispose pour mes UserControls ?

    PS: Jérôme Lambert, j'ai fait ce que tu avais dit, et le, même problème se reproduit, avec l'instanciation à tous les coups,...

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    346
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 346
    Par défaut
    Bonjour,

    dans l'évènement FPlanning_FormClosed tu appelles:

    Donc ta form FEnrouleuse qui hérite de la form FPlanning est diposé dès que tu la fermes.
    Donc il est normal que lors d'une réouverture et de l'appel de la méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FEnrouleuse.Visible = true;
    tu reçoives le message Cannot access a disposed object

    Pour moi, l'appel de la méthode dans l'évènement de fermeture ne sert à rien.

    Dans la fenêtre appelante, je suppose que tu as définies une variable privée de type FEnrouleuse.
    Ainsi dans la méthode surchargée Dipose de la form appelante, tu devrais écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if (FEnrouleuse != null)
        FEnrouleuse.Dispose();
    ++

  6. #6
    Membre éclairé
    Inscrit en
    Juin 2007
    Messages
    359
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 359
    Par défaut
    Merci zoaax pour ta réponse, mais comment fait on pour faire une "méthode surchargée Dipose" ?

    J'ai enlevé le Dispose comme tu m'as dit, mais le problème est toujours là,...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probleme "Cannot access a disposed object"
    Par the-morpher dans le forum Windows Forms
    Réponses: 4
    Dernier message: 04/06/2009, 16h52
  2. pb envoi mail "Could not access 'CDO.Message' object"
    Par adaneels dans le forum ASP.NET
    Réponses: 3
    Dernier message: 07/05/2009, 15h29
  3. Réponses: 15
    Dernier message: 21/01/2007, 22h47
  4. Réponses: 7
    Dernier message: 16/06/2006, 11h09
  5. [SIGBUS] Cannot Access Memory apres un Malloc?
    Par predacktor dans le forum C
    Réponses: 5
    Dernier message: 18/03/2006, 17h11

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