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 :

Erreur A circular control reference has been made.


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 75
    Points : 60
    Points
    60
    Par défaut Erreur A circular control reference has been made.
    Bonjour,

    j'ai dans ce bout de code l'erreur suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A circular control reference has been made. A control cannot be owned by or parented to itself.
    un singleton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static MyClass Instance
            {
                get
                {
                    if (instance == null)
                    {
                        instance = new MyClass();
                    }
                    return instance;
                }
            }
    La méthode qui plante à l'intérieur de ma classe MyClass
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     public bool myMethod()
            {
                MyUserControl control = Instance
    
                  MainEditNewDialogGlobal dlg = new MainEditNewDialogGlobal(control);       
    
                DialogResult res = dlg.ShowDialog(this); ---> ERREUR ICI
                if (res == DialogResult.OK)
                {               
                    return true;
                }
                return false;
            }
    ma classe MainEditNewDialogGlobal

    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
     
    public partial class MainEditNewDialogGlobal : Form
    {
     private MainUserControl activeControl = null;
    
     public MainEditNewDialogGlobal(MainUserControl control)
            {
                InitializeComponent();
                this.ClientSize = control.Size;
                this.Height += pnlButtons.Height;
                this.activeControl = control;
                this.activeControl.Parent = this;
                this.activeControl.Dock = DockStyle.Fill;
                this.activeControl.TabIndex = 1;
            }
    L'erreur se produit quand je suis à la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     DialogResult res = dlg.ShowDialog(this);
    et que ma propriété Instance ne vient pas d'être créée (depuis le 2ème appel).

    Pourquoi est-ce que cela se produit? Quelle est la correction à apporter?

    Tout fonctionne bien si je n'utilise pas un Singleton, mais justement l'idée est d'en utiliser un pour limiter le nombre d'instance de MyClass.

    Quelqu'un aurait-il une idée ??

    Merci d'avance amis développeurs.

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 004
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 004
    Points : 5 423
    Points
    5 423
    Par défaut
    J'ai du mal a comprendre le code.

    Déja tel que je le comprends, je ne comprend pas l'interet de ton singleton, parceque comme il est utilisé, tu peux remplacer par "this" que ca serait la meme chose.
    Ensuite c'est quoi un new Form(Parametre) ? Je ne vois pas de constructeur avec parametre pour le Form.

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 75
    Points : 60
    Points
    60
    Par défaut
    Désolé, j'ai voulu simplifier mon code pour mieux l'expliquer, mais j'ai un peu trop simplifié on dirait.

    J'ai apporté des corrections au 1er post (en rouge).

    dans ma solution, on a un UserControl(MyUserControl) qui est en read-only. Si on double click sur un node, on affiche ce MyUserControl dans un Form stand-alone (DialogResult) afin de pouvoir faire des modifications des champs et sauvegarder.

    Et le but est de ne pas avoir une nouvelle instance de MyUserControl à chaque fois que l'on double-clique sur le node, car cela est très gourmand en mémoire, et l'application crashe pour cette raison après quelques heures, d'où l'utilité de mon singleton, qui évite de recréer à chaque fois une instance.

    Je sais que ce ne n'est pas le code le plus "clean", mais que veux-tu, solution existante comme on dit ...

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 004
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 004
    Points : 5 423
    Points
    5 423
    Par défaut
    lorsque tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyUserControl control = Instance
    c'est equivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyUserControl control = this
    non?

    Du coup lorsque tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MainEditNewDialogGlobal dlg = new MainEditNewDialogGlobal(control);
    c'est comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MainEditNewDialogGlobal dlg = new MainEditNewDialogGlobal(this);
    TU va donc demander une nouvelle fenetre qui contient le meme usercontrol que celui qui l'appel.
    Pourquoi est ce que l'affichage des nodes, et l'affichage du details sont fait a partir du meme UC ?

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 75
    Points : 60
    Points
    60
    Par défaut
    Citation Envoyé par micka132 Voir le message
    Pourquoi est ce que l'affichage des nodes, et l'affichage du details sont fait a partir du meme UC ?
    Tout à fait pour le code, tu as raison. Comment est-ce que je peux changer cela?

    pour l'affichage du détail et l'affichage des nodes, je ne suis pas sûr d'avoir compris ce que tu veux dire. Pourrais-tu préciser ??

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 004
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 004
    Points : 5 423
    Points
    5 423
    Par défaut
    Dans le code que tu présentes je ne sais pas bien s'il s'agit d'un singleton sur une Form ou sur un UserControl. Mais bon sans tout voir je sais vraiment pas ce qu'il faudrait changer pour "améliorer"

    Sinon encore dans le code je pense que le probleme se situe ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DialogResult res = dlg.ShowDialog(this); ---> ERREUR ICI
    C'est équivalent à faire (le nom "activeControl" n'a bien sur rien à faire ici mais c'est pour comprendre):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dlg.ShowDialog(activeControl);
    il y a un probleme avec this.activeControl.Parent = this;

    désolé j'ai pas le temps de réflechir, mais normalement en enlevant ce dernier ca devrait fonctionner.

Discussions similaires

  1. Réponses: 5
    Dernier message: 20/12/2011, 19h00
  2. Warning: Call-time pass-by-reference has been deprecated
    Par Poseidon62 dans le forum Langage
    Réponses: 8
    Dernier message: 16/10/2011, 17h03
  3. Réponses: 2
    Dernier message: 11/08/2008, 18h24
  4. [1.x] Erreur: No driver has been registered to handle connection type
    Par phpiste dans le forum Symfony
    Réponses: 1
    Dernier message: 21/05/2008, 16h59
  5. Classe JDialog + cannot reference parent before supertype constructor has been called
    Par une_tite_question dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 08/04/2008, 16h51

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