2008-12-03 5 views
8

J'ai un contrôle d'utilisateur que je construis. Son but est d'afficher le statut d'une classe à l'utilisateur. Évidemment, cela n'a pas d'importance et ralentira les choses lorsque le contrôle s'exécutera dans l'EDI, comme il le fait dès que vous l'ajoutez à un formulaire. Une façon de contourner ce problème consiste à créer le contrôle et à l'ajouter à la collection de contrôles du formulaire au moment de l'exécution. Mais cela semble moins que parfait.Comment puis-je détecter si un contrôle utilisateur s'exécute dans l'EDI, en mode débogage ou dans l'EXE libéré?

Existe-t-il un moyen de définir un indicateur dans le contrôle afin qu'il puisse ignorer certaines sections de code en fonction de son fonctionnement?

p.s. J'utilise C# et VS 2008

Répondre

15
public static bool IsInRuntimeMode(IComponent component) { 
    bool ret = IsInDesignMode(component); 
    return !ret; 
} 

public static bool IsInDesignMode(IComponent component) { 
    bool ret = false; 
    if (null != component) { 
     ISite site = component.Site; 
     if (null != site) { 
      ret = site.DesignMode; 
     } 
     else if (component is System.Windows.Forms.Control) { 
      IComponent parent = ((System.Windows.Forms.Control)component).Parent; 
      ret = IsInDesignMode(parent); 
     } 
    } 

    return ret; 
} 
+0

Impressionnant! Merci. C'est beaucoup plus facile que ce que je pensais! – RichieACC

+0

Des réflexions sur la raison pour laquelle la propriété Site est toujours nulle sur mon objet Page? – TGnat

+0

Parce que le concepteur Webforms ne prend pas en charge ce scénario. Je ne sais pas pourquoi :(Cette solution fonctionne dans le concepteur de composants et de winforms de composants (non UI) Il devrait fonctionner aussi dans des concepteurs tiers de non-web – TcKs

4

J'ai trouvé cette réponse sur un autre poste et il semble être plus facile et mieux travailler pour ma situation.

Detecting design mode from a Control's constructor

using System.ComponentModel; 

if (LicenseManager.UsageMode == LicenseUsageMode.Runtime) 
{ 
} 
Questions connexes