Feedback

C# - .DesignMode Workaround (Windows Forms)

Veröffentlicht von am 11/6/2006
(3 Bewertungen)
Workaround für die .DesignMode Eigenschaft in Visual Studio 2003,2005

Die Eigenschaft .DesignMode eines Controls,
welches die ISite Schnittstelle implementiert gibt zurück, ob sich das Control im DesignMode befindet.

Sobald das Control in ein anderes Control im Designer eingebettet wird gibt die Eigenschaft immer false zurück,
obwohl noch im Designer gearbeitet wird.

Beispiel:
Control1 lädt eine Liste über einen Anwendungsserver, dies soll allerdings nur im Ausführungsmodus geschehen.
Control2 bindet Control1 ein.
Wenn ihr nun das Control2 noch auf ein Form plaziert habt ihr ein Problem: ;-(
Nun würden beim Designen des Forms die Liste des Control1 geladen werden, wenn man einfach im Control1 über .DesignMode den DesignMode abprüft.
Verwendung dieser Funktion gibt abhilfe.

Statt
"this.DesignMode"
"IsDesignMode(this)"
verwenden.

Diese Funktionalität steht noch nicht im Konstruktor zur verfügung,
Diese Eigenschaft kann im Load Event eines Controls abgefragt werden.
/// <summary>
/// Diese Funktion dient der umgehung des .DesignMode Problems in .Net
/// 
/// Die Eigenschaft .DesignMode eines Controls,
///welches die ISite Schnittstelle implementiert gibt zurück, ob sich das Control im DesignMode befindet.
///
///Sobald das Control in ein anderes Control im Designer eingebettet wird gibt die Eigenschaft immer false zurück,
///obwohl noch im Designer gearbeitet wird.
///
///Beispiel:
///Control1 lädt eine Liste über einen Anwendungsserver, dies soll allerdings nur im Ausführungsmodus geschehen.
///Control2 bindet Control1 ein.
///Wenn ihr nun das Control2 noch auf ein Form plaziert habt ihr ein Problem: ;-(
///Nun würden beim Designen des Forms die Liste des Control1 geladen werden, wenn man einfach im Control1 über .DesignMode den DesignMode abprüft.
///Verwendung dieser Funktion gibt abhilfe.
///
///Statt
///"this.DesignMode"
///"IsDesignMode(this)"
///verwenden.
///
///Diese Funktionalität steht noch nicht im Konstruktor zur verfügung,
///Diese Eigenschaft kann im Load Event eines Controls abgefragt werden.
/// </summary>
/// <param name="control">Control, welches auf den DesignMode überprüft werden soll</param>
/// <returns>True Wenn sich das Control im DesignMode befindet</returns>
public static bool IsDesignMode(Control control)
{
    //Solange noch ein Control zum prüfen vorhanden ist
    while (control != null)
    {
        //Die Site Eigenschaft des Controls auslesen
        PropertyInfo siteProperty = control.GetType().GetProperty("Site");

        //Falls die .Site Eigenschaft gefunden wurde
        if (siteProperty != null)
        {
            //Eigenschaftswert auslesen
            ISite site = siteProperty.GetGetMethod().Invoke(control, new object[0]) as ISite;

            //Falls eine Site Eigenschaft vorhanden ist
            if (site != null)
                //Wenn sich das Control im DesignMode befindet
                if (site.DesignMode)
                    //Eins der Controls befindet sich noch im Design Mode
                    return true;
        }

        //Parent auslesen, und auch hier die .DesignMode überprüfen
        control = control.Parent;
    }

    //Kein Control befand sich im Designmode
    return false;
}
Abgelegt unter DesignMode, Workaround, Designer, Forms, Controls.

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!