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 :

[DESIGNER] empêcher le designer d'exécuter une ligne de code


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Points : 51
    Points
    51
    Par défaut [DESIGNER] empêcher le designer d'exécuter une ligne de code
    Bonjour,

    Je travaille actuellement en C# avec VS2008.
    J'ai créé un UserControl qui dans son constructeur fait appelle à une méthode de DLL (elle utilise un backGroundWorker et une form) pour faire un chargement spécifique .

    La compilation fonctionne bien et l'exécution également. Mon souci apparaît uniquement lorsque je veux me servir du designer, ce dernier me fait des erreurs. Il bloque sur la méthode de ma DLL et dit qu'il ne la trouve pas.

    Je souhaitais donc savoir si via un #if je pouvais arriver à l'empêcher d'exécuter cette ligne?

    Cela donnerai un truc dans ce genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public MonUC()
            {
                InitializeComponent();
     
                //code à exécuter
    ...
     
    #if ???
                    //code que je ne veux pas exécuter juste quand j'utilise le designer
    #endif
                   //code à exécuter
            }
    Pour info "#if RELEASE || DEBUG" ne fonctionne pas vu que le designer exécute forcément le constructeur dans l'un de ces modes.

    Merci d'avance!

    Rastamath69
    Rastamath69,

    Plus on travaille , plus on a des problèmes, donc plus on a de chances d'en résoudre!

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Points : 1 521
    Points
    1 521
    Par défaut
    MSDN :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Component..::.DesignMode, propriété 
     
    Obtient une valeur qui indique si Component est actuellement en mode design.
     
    protected bool DesignMode { get; }
    Pour information, tous les composants graphiques (et donc Form) dérivent de Component.

    Par contre ! Tester cette valeur permet de ne pas exécuter une partie du code pendant le design mais tout le code est tout de même compilé et doit donc pouvoir être résolu entièrement et syntaxiquement correct. Il n'y a pas, à ma connaissance, de flag de compilation conditionnelle permettant de définir si la compilation s'effectue lors d'un design ou lors d'une exécution (je ne penses pas que le compilateur le sache).

  3. #3
    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
    Quelle techno utilises-tu ? Windows Forms, ASP.NET, WPF ?

    La réponse de Kaidan est correcte pour Windows Forms car les contrôles héritent de Component.

    En ASP.NET, les contrôles n'héritent pas de Component, mais implémentent l'interface IComponent. Celle-ci n'expose pas de propriété DesignMode, mais a une propriété de type ISite qui expose cette propriété. Donc pour obtenir la propriété DesignMode d'un contrôle, tu peux faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool designMode = ((ctl.site != null) && ctl.site.DesignMode);
    Si c'est pour WPF, il faut utiliser la propriété attachée DesignerProperties.IsInDesignMode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool designMode = DesignerProperties.GetIsInDesignMode(ctl);

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Points : 1 521
    Points
    1 521
    Par défaut
    J'ai créé un UserControl qui dans son constructeur fait appelle à une méthode de DLL (elle utilise un backGroundWorker et une form)
    J'ai effectivement supposé qu'il était en WinForms .

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Points : 51
    Points
    51
    Par défaut
    Bonjour à tous les deux,

    Effectivement je connais cette propriété DesignMode.
    Malheureusement cette dernière est toujours fausse dans un constructeur tout simplement parce qu'elle est déduite de l'interface ISite.
    Or le constructeur est appelé avant que le control soit associé à ISite.

    Pour ce qui est du compilateur, du fait qu'il arrive à, par exemple, distinguer le mode RELEASE du mode DEBUG, je me disais justement qu'il pouvait exister un flag pour indiquer un mode dit "DESIGNER".
    Moi non plus je n'en connais pas, d'où ma question sur le forum!!

    Et oui je suis bien en WinForm

    Rastamath69
    Rastamath69,

    Plus on travaille , plus on a des problèmes, donc plus on a de chances d'en résoudre!

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Points : 1 521
    Points
    1 521
    Par défaut
    Est-ce qu'il n'est pas possible tout simplement de déplacer le code placé dans ton constructeur dans l'événement Load ? Il est nécessaire pour toi d'y avoir accès avant cet événement ?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Points : 51
    Points
    51
    Par défaut
    J'avais effectivement essayé cette solution mais cela ne marche pas non plus...

    Voici la pile d'appel que me retourne VS quand j'essaie d'afficher le designer:

    à MonNameSpace.MonUC.MonUC_Load(Object sender, EventArgs e)
    à System.Windows.Forms.UserControl.OnLoad(EventArgs e)
    à System.Windows.Forms.UserControl.OnCreateControl()
    à System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
    à System.Windows.Forms.Control.CreateControl()
    à System.Windows.Forms.Control.ControlCollection.Add(Control value)
    à System.Windows.Forms.Form.ControlCollection.Add(Control value)
    à System.Windows.Forms.Design.ControlDesigner.DesignerControlCollection.Add(Control c)
    On constate que l'événement Load est quand même déclenché...
    De plus l'utilisation dans cet événement de la propriété DesignMode, s'avère également inutile vu que la propriété de Type ISite n'est pas encore renseignée...

    Sans Flag spécifique, je ne suis pas arrivé à trouver de moyen de contournement.
    Mais je n'ai surement pas tout essayé, si tu as d'autres idées je suis preneur.

    Merci d'essayer de m'aider en tout cas.

    Rastamath69
    Rastamath69,

    Plus on travaille , plus on a des problèmes, donc plus on a de chances d'en résoudre!

  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 Kaidan Voir le message
    J'ai effectivement supposé qu'il était en WinForms .
    Ah oui, j'avais lu la question un peu vite...

    Citation Envoyé par rastamath69 Voir le message
    Pour ce qui est du compilateur, du fait qu'il arrive à, par exemple, distinguer le mode RELEASE du mode DEBUG, je me disais justement qu'il pouvait exister un flag pour indiquer un mode dit "DESIGNER".
    Non, ça n'existe pas.

    D'ailleurs il n'y a pas non plus de "flag" DEBUG ou RELEASE implicite du fait que tu compiles en Debug ou Release. Pour chaque configuration (Debug, Release, autre...) tu peux définir des symboles de compilation conditionnelle. Il se trouve que par défaut, la configuration Debug définit le symbole DEBUG, mais tu peux tout à fait le supprimer de façon à ce que #if DEBUG soit faux... bref, il n'y a pas de lien "figé" entre la configuration dans laquelle tu compiles et le symbole DEBUG ou RELEASE

    Citation Envoyé par Kaidan Voir le message
    Est-ce qu'il n'est pas possible tout simplement de déplacer le code placé dans ton constructeur dans l'événement Load ? Il est nécessaire pour toi d'y avoir accès avant cet événement ?
    Ca me semble effectivement être la meilleure solution...

  9. #9
    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 rastamath69 Voir le message
    De plus l'utilisation dans cet événement de la propriété DesignMode, s'avère également inutile vu que la propriété de Type ISite n'est pas encore renseignée...
    Je viens de tester, DesignMode renvoie bien true dans l'évènement Load, et Site est bien renseigné...

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Points : 51
    Points
    51
    Par défaut

    Je me suis placé dans L'évenement Load de mon UserControl et la propriété Site est bien à null et donc DesignMode à false.

    Je viens de re-tester pour être sûr...

    Rastamath69
    Rastamath69,

    Plus on travaille , plus on a des problèmes, donc plus on a de chances d'en résoudre!

  11. #11
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par rastamath69 Voir le message
    Bonjour à tous les deux,

    Effectivement je connais cette propriété DesignMode.
    Malheureusement cette dernière est toujours fausse dans un constructeur tout simplement parce qu'elle est déduite de l'interface ISite.
    Absolument exact et c'est d'ailleurs souvent un casse-tête.

    En revanche je m'interroge sur la pertinence de l'ajout du code dans le constructeur des contrôles et/ou forms; en général ce n'est pas très logique et on préférera utiliser un ou l'autre des évènements d'initialisation.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  12. #12
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    J'avais le même problème avec des Form héritées et à l'époque je m'en était sorti avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (LicenseManager.UsageMode != LicenseUsageMode.Designtime)
    {
        ...
    }
    Seule solution que j'avais trouvé.
    Pas de questions techniques par MP

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Points : 51
    Points
    51
    Par défaut
    Je suis d'accord avec toi BlueDeep, la solution de Kaidan est plus élégante et d'ailleurs c'est celle que je vais adopter!

    Sinon tomLev tu avais raison! Le DesignMode est bien renseigné. Je ne me basais que sur l'erreur que j'obtenais et cela a faussé mes tests. Mais j'ai essayé de modifier le nom d'un bouton:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(this.DesignMode)
    {
        monBouton.Text = "Bob";
    }
    et il s'avère que j'y passe bien quand je lance le Designer. Par contre je ne m'explique donc pas pourquoi en pas à pas this.Site est null??

    Bref avec ça mon problème était toujours persistant, et cela n'avait donc plus de sens vu que le DesignMode me permettait de ne pas passer sur la ligne incriminée...
    Mais j'ai trouvé la solution!! Et c'est une solution qui m'avait déjà sauvé par le passé!! Car le problème ne venait pas en fait de cette fameuse méthode,
    mais visiblement d'un problème (surement d'un cache) dans VS2008!!!!

    Il m'a suffit de ne pas faire confiance à la fonctionnalité "Clean" de VS et de virer à la main le dossier DEBUG, afin qu'il soit recompilé proprement. Et à présent ma form arrive à s'afficher sans problème!

    Vous me direz : s'il y avait eu un problème de DLL pas à jour dans le dossier DEBUG je n'aurais jamais pu compiler comme je le faisais. C'est pour cela que j'en déduis qu'un cache (propre au designer) référençant les signatures de méthodes des DLL n'avait pas dû être mis à jour!

    Merci à vous en tout cas pour toute cette réflexion qui m'a permis d'élucider cette affaire!

    Rastamath69
    Rastamath69,

    Plus on travaille , plus on a des problèmes, donc plus on a de chances d'en résoudre!

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

Discussions similaires

  1. [CS4] exécuter une ligne de code "reconstruite"
    Par aerosky dans le forum Flash
    Réponses: 0
    Dernier message: 29/12/2010, 14h17
  2. Comment exécuter une ligne de commande ?
    Par tarekos dans le forum C#
    Réponses: 26
    Dernier message: 27/06/2008, 15h44
  3. [Système] Exécuter une ligne de commande
    Par fordprobe dans le forum Langage
    Réponses: 2
    Dernier message: 09/07/2007, 14h46
  4. Réponses: 7
    Dernier message: 19/12/2006, 12h11
  5. Exécuter une ligne de commande dos
    Par koKoTis dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 20/08/2006, 07h03

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