Windows.Forms DesignMode-Flag: Wenig hilfreich


Thomas Wölfer
Thomas Wölfer

25. Juli 2005


Die 'Control' Klasse von Windows.Forms hat ein 'DesignMode'-Flag. Steht das auf true, dann befindet sich das Control im Designer, ansonsten nicht. Sollte man zumindest anhand des Namens und der Dokumentation annehmen - so ist das aber leider nicht. Das ist besonders dann extrem ärgerlich, wenn man selbst programmierte UserControls verwendet, denn die greifen nunmal gern auf Daten zu, die im DesignMode nicht unbedingt vorhanden sind. Also schaut man vor derartigem Code erstmal nach, ob DesignMode gesetzt ist - und ist das der Fall, lässt man die Sache eben bleiben.

Dummerweise: Das Flag ist nur gesetzt, wenn das direkte Parent des Controls im DesignMode ist. Sind einige Control ineinander verschachtelt, dann klappt das ganze nicht mehr, und man bekommt ein 'false' - auch dann, wenn sich das Control momentan im Forms-Editor befindet. Resultat: Absturz des Controls im Forms-Editor.

Um wirklich sicher zu gehen, ob man sich im Design-Mode befindet, müsste man rekursiv in der Control-Verschachtelung bis ganz nach oben gehen und nachsehen, ob eines der Parents im DesignMode ist. Das geht aber nicht, weil DesignMode 'Protected' ist. Suuuuper.

Statt dessen kann man aber auf die 'Site' schauen - das geht so:

    public static class ControlHelper
    {
        public static bool IsInDesignMode( Control control )
        {
            if( control.Parent != null )
            {
                if( control.Parent.Site != null )
                {
                    return true;
                }
                else
                {
                    return IsInDesignMode( control.Parent );
                }
            }

            return false;

        }
    }