Wie erzeugt man Server Controls zur Laufzeit?

Veröffentlicht: 18. Jul 2008

Das Problem

Sie möchten innerhalb Ihrer ASP.NET-Anwendung zur Laufzeit Controls erzeugen, um z.B. Eingabefelder oder Links abhängig von den Eingaben des Benutzers anzeigen lassen zu können.

Die Lösung

Server Controls werden innerhalb des Codes wie alle anderen Objekte erzeugt und müssen danach nur eine Controls-Collection hinzugefügt werden. Das Objekt Page der aktuellen Seite stellt eine solche Collection bereits standardmäßig zur Verfügung. Im folgenden Beispiel wird ein Hyperlink zur Seite http://www.codezone.de erzeugt und der Controls-Collection der Seite hinzugefügt:

HyperLink link = new HyperLink();
link.Text = "Zur Laufzeit erzeugter Link";
link.NavigateUrl = "http://www.codezone.de";
this.Controls.Add(link);      

Jedes Control enthält die Eigenschaft Controls, der weitere Server Controls auf gerade dargestellte Weise hinzugefügt werden können. Sie müssen sich jedoch darüber im Klaren sein, dass die ChildControls dann innerhalb des Parents erzeugt und auch vom Browser verarbeitet werden. Um mehrere Controls an einer bestimmten Stelle anzeigen zu lassen, eignen sich bestimmte Container-Controls, z.B.:

  • PlaceHolder
  • Panel

Der Code C#

protected void Page_Load(object sender, EventArgs e)
{
HyperLink link = new HyperLink();
link.Text = "Zur Laufzeit erzeugter Link";
link.NavigateUrl = "http://www.codezone.de";
this.Controls.Add(link);
}

Der Code VB.NET

Dim link As HyperLink = New HyperLink()
link.Text = "Zur Laufzeit erzeugter Link"
link.NavigateUrl = "http://www.codezone.de"
Me.Controls.Add(link)

Nächste Schritte

Eine erweiterte Variante wäre es, eine Seite dynamisch so aufzubauen, dass beispielsweise in der Datenbank oder einer Konfigurationsdatei hinterlegt ist, welche Controls angezeigt werden sollen. Da in diesem Fall die Klassen nicht zur Entwicklungszeit vorgegeben sind und in beiden Fällen auch nur als Text zur Verfügung stehen, besteht hier die Herausforderung darin, zuerst die zu erstellende Klasse zu bestimmen. Hier ein Beispiel, wie dies realisiert werden kann:

Type classType;
classType = System.Type.GetType("System.Web.UI.WebControls.TextBox,
                             System.Web, Version=2.0.0.0,
                             Culture=neutral,
                             PublicKeyToken=b03f5f7f11d50a3a",
                             true,
                             true);
Control ctrl = (Control)System.Activator.CreateInstance(classType,
                              System.Reflection.BindingFlags.CreateInstance,
                              null,
                              null,
                              null);

Da diese Form der Erzeugung von Controls jedoch erheblich komplexer ist, soll sie hier nur als Ansatzpunkt für weitere Möglichkeiten genannt werden.

Weiterführende Links

Control.Controls Property
http://msdn.microsoft.com/en-us/library/system.web.ui.control.controls.aspx

Code zum Download und CodeClip

Wie erzeugt man Server Controls zur Laufzeit?