2012-04-03 6 views
2

Ich arbeite in Winforms, und ich versuche, in einigen Fällen zu verknüpfen, wenn ein Formular \ component \ usercontrol im Designer angezeigt wird, bin ich versuchen, in einigen statischen Ereignissen zu verknüpfen, die Einstellungen aus der app.config-Datei laden.Winforms - Führen Sie eine Funktion aus, wenn ein Formular in den Designer geladen wird

Ist es für mich möglich, Code in meinem Projekt zu definieren, der besagt "wann immer ein Steuerelement geladen wird, führe dieses Ereignis aus?"

bearbeiten Dies ist streng genommen eine Design-Zeit-Sache.

Ich habe eine Basisform, in DLL "A". Das hat eine Tonne Eigenschaften, "ColorLocation, SizeLocation" und Dinge dieser Art.

In DLL "B" habe ich eine abgeleitete Form. Wenn B in den Designer geladen wurde, hatte ich iEditorComponents (erinnere mich nicht an den genauen Namen), der dem Benutzer ermöglicht, ColorLocation aus einer riesigen Liste von Elementen auszuwählen, die in der app.config Einstellungsdatei für das aktuelle Projekt angegeben sind.

Das Problem ist, die Bearbeitungskomponente ist in Dll "A", die die Basis ist, und es hat keinen Zugriff auf die app.config in "B".

Ich brauche irgendwie zu sagen, die Editier-Komponente zu "Hey, verwenden Sie diese Liste von Zeichenfolgen, um Ihre Bearbeitungssteuerung zu füllen". Der Designer tut alles in seiner Macht stehende, es scheint keinen Code in den abgeleiteten Klassen ausführen zu wollen.

+2

Das klingt nicht gut. Entwurfszeit ist eine Welt weg von der Laufzeit. Zum einen gibt es keine gute Möglichkeit, auf die app.config-Datei eines Projekts zuzugreifen. Zum anderen sollten die Chancen, dass jemand da ist, um das Event zu hören, Null sein. –

+0

Können Sie Ihren Anwendungsfall etwas erklären? Meinst du, du möchtest Code in deiner Komponente ausführen, wenn das enthaltene Formular geladen wird? –

+0

Ist das auch eine Design Time oder Runtime Sache? –

Antwort

3

Ja, es ist möglich, aber stellen Sie sicher, was Sie tun, weil klingt seltsam.

Verwenden Sie den folgenden Code in Ihr Form's oder Control's Konstruktor:

public void Form1() 
    { 
     InitializeComponent(); 

     if (IsInWinFormsDesignMode()) 
     { 
      // your code stuff here 
     } 
    } 

    public static bool IsInWinFormsDesignMode() 
    { 
     bool returnValue = false; 

     #if DEBUG 

     if (System.ComponentModel.LicenseManager.UsageMode == 
      System.ComponentModel.LicenseUsageMode.Designtime) 
     { 
      returnValue = true; 
     } 

     #endif 

     return returnValue; 
    } 

Hoffe, es hilft.

+0

Die Ladeereignisse werden nicht vom Designer ausgelöst. –

+0

@Boo: Ja, du hast Recht, ich habe meine Antwort bearbeitet. Vielen Dank! –

1

Ich weiß nicht, ob dies für Ihren speziellen Anwendungsfall gilt, aber irgendwann musste ich mit dem Container einer Komponente (dh dem Formular) interagieren, so dass ich Code vom ErrorProvider "gestohlen" habe :

//code goes in your Component/Control 

private ContainerControl _containerControl = null; 

//Will contain a reference to the Form hosting this Component 
     public ContainerControl ContainerControl 
     { 
      get { return _containerControl; } 
      set { _containerControl = value; 
       //In here setup what you need from the Form 
       //for example add a handler 
       } 
     } 

     //Allows the VS.NET designer to set the ContainerControl 
     //in the designer code. Stolen from ErrorProvider. 
     public override ISite Site 
     { 
      set 
      { 
       base.Site = value; 
       if (value != null) 
       { 
        IDesignerHost host = value.GetService(typeof(IDesignerHost)) as IDesignerHost; 
        if (host != null) 
        { 
         IComponent rootComponent = host.RootComponent; 
         if (rootComponent is ContainerControl) 
         { 
          this.ContainerControl = (ContainerControl)rootComponent; 
         } 
        } 
       } 
      } 
     } 

habe ich auch ein String abgeleiteten Klasse mit externen Ressourcen vom Designer zu interagieren:

public class OpcDotNetTagConverter : StringConverter 
    { 
     #region Make It A ComboBox 
     public override bool GetStandardValuesSupported(ITypeDescriptorContext context) 
     { 
      return true; 
     } 
     public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) 
     { 
      return false; 
     } 
     #endregion 

     #region Display Tags In List 
     public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) 
     { 
      if ((context == null) || (context.Container == null)) 
      { 
       return null; 
      } 

      Object[] Tags = this.GetTagsFromServer(context); 
      if (Tags != null) 
      { 
       return new StandardValuesCollection(Tags); 
      } 
      return null; 
     } 

     private object[] GetTagsFromServer(ITypeDescriptorContext context) 
     { 
      List<string> availableTags = new List<string>(); 

      if (context.Instance == null) 
      { 
       availableTags.Add("ITypeDescriptorContext.Instance is null"); 
       return availableTags.ToArray(); 
      } 


      Interfaces.IOpcDotNetServerEnabled inst = context.Instance as Interfaces.IOpcDotNetServerEnabled; 
      if (inst == null) 
      { 
       availableTags.Add(context.Instance.ToString()); 
       return availableTags.ToArray(); 
      } 

      if (inst.OpcDotNetServer == null) 
      { 
       availableTags.Add("No server selected"); 
       return availableTags.ToArray(); 
      } 

      availableTags = inst.OpcDotNetServer.GetTagList(string.Empty); 
      availableTags.Sort(Comparer<string>.Default); 
      return availableTags.ToArray(); 
     } 

     #endregion 

     public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) 
     { 
      if(sourceType == typeof(string)) 
       return true; 
      return base.CanConvertFrom(context, sourceType); 
     } 

     public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) 
     { 
      if (value is string) 
       return value.ToString(); 
      return base.ConvertFrom(context, culture, value); 
     } 

    } 

ich diese Hoffnung eine Hilfe sein kann.

Prost

Verwandte Themen