Du bist hier: Skip Navigation LinksHome > .NET > Artikel

Eigenschaften benutzerdefinierter Steuerelemente über Markup initialisieren

Ich schreibe heute etwas über ASP.NET Server Controls. Das klingt wenig spannend, da es bereits dutzende Blog-Beiträge zu diesem Thema gibt, aber es ist ein interessantes Thema und es begleitet mich gerade im aktuellen Projekt. Einen Teil meiner Erfahrungen möchte ich hier in einer mehrteiligen Serie zur Verfügung stellen. Im Fokus der Artikel steht die Anpassung und Erweiterung der Entwurfszeit von Server Controls. Im ersten Teil geht es um die Verwendung komplexer Typen in Eigenschaften und was man tun muss, um diese über das Markup der Seite zu initialisieren.

Die Eigenschaften eines Controls über das Markup der Seite zu initialisieren, klingt zunächst einfach. Am Beispiel eines Label-Steuerlements kann die die Text-Eigenschaft wie folgt gesetzt werden.

            <asp:Label ID="label1" Text="Hello World." runat="server"></asp:Label>
          

Das funktioniert allerdings nur für Eigenschaften, die in einem Attribut abgebildet werden können. Mit komplexen Typen funktioniert das nicht - diese müssen im Markup als Element(e) abgebildet werden.

            <uc:CommandHandler ID="commandHandler1" runat="server">
              <Commands>
                <Command ControlId="Button1" ActionId="">
                <Command ControlId="Button2" ActionId="">
              </Commands>
            </uc:CommandHandler>
          

Der passende C#-Code sieht so aus...

            [NonVisualControl()]
            public class CommandHandler : System.Web.UI.Control 
            {
              List<Command> m_commands;
            
              public CommandHandler() 
              {
                m_commands = new List<Command>();
              }

              public List<Command> Commands 
              {
                get { return m_command; }
              }
            }
          

So weit so gut - nur bleibt die Commands-Auflistung zur Laufzeit leer, da der Parser noch nicht angewiesen wurde, die Inhalte, die sich innerhalb des Steuerelementtags befinden, als Eigenschaften zu interpretieren. Dazu wendet man das ParseChildren-Attribute auf die Steuerelement-Klasse an.

            [NonVisualControl(), ParseChildren(true)]
            public class CommandHandler : System.Web.UI.Control 
            {
            
            }
          

Das Hinzufügen des ParseChildren-Attributs reicht allerdings noch nicht aus. Die Eigenschaften der Klasse müssen zusätzlich mit einem PersistenceMode-Attribut versehen werden. Das PersistenceMode-Attribut legt fest, wie die Eigenschaft im Markup abgebildet ist – entweder als Attribut oder als Element. Und noch ein weiteres Attribut kommt ins Spiel - das DesignerSerializationVisibility-Attribut kommt auch bei der Entwicklung von Komponenten im Allgemeinen zum Einsatz. Es legt die Sichtbarkeit der Eigenschaft bezüglich der Serialisierung fest und wird für die Unterstützung der Entwurfszeit benötigt.

            [NonVisualControl(), ParseChildren(true)]
            public class CommandHandler : System.Web.UI.Control 
            {

              [PersistenceMode(PersistenceMode.InnerProperty)]
              [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
              public List<Command> Commands 
              {
                get { return m_command; }
              }
            }
          

Die Control-Klasse, sowie deren Eigenschaften, kann mit weiteren Attributen versehen werden - ich schreibe bewusst "kann", denn weitere Attribute werden nur erforderlich, wenn man dem Control eine verbesserte Unterstützung der Entwurfszeit spendieren möchte. Ohne weiteren Schnick-Schnack wird das Control im Designer so dargestellt...

Kick it on dotnet-kicks.de

Kommentare

plop83 schrieb am: 2009-06-08 "Nicht schlecht... habe allerdings ein Problem. Ich habe wie von dir geschildert ein Control gebaut; die Eigenschaften werden werden vom Designer ins Markup übernommen und umgekehrt. Allerdings stelle ich fest, das nachträgliche Änderungen über das Property-Grid nicht ins Markup übernommen werden. Hast du einen Tipp?"

Matthias schrieb am: 2009-06-08 "Stimmt. Verhält sich bei mir genauso... Werde das unter die Lupe nehmen und den Artikel ergänzen."

Kommentar schreiben

Name*:  
Email*:  
Website:
Kommentar: