Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden
+49 (0) 351/850 33-0

User Controls dynamisch zur Laufzeit in ein Web Form einbinden

Web User Controls (*.ascx) kann man zur Designzeit sehr bequem per Drag & Drop auf ein Web Form (*.aspx) ziehen – den Rest erledigt Visual Studio für uns.Wenn man das Gleiche dynamisch zur Laufzeit erreichen möchte (weil man z.B. unterschiedliche ascx-Dateien verwenden oder einunddieselbe ascx-Datei mehrmals nacheinander laden will), kann man das folgendermaßen bewerkstelligen:

Unser User Control heißt „SampleControl“ und besteht aus einem Label, einer TextBox und einem Button:

<%@ Control Language=“C#“ AutoEventWireup=“true“ CodeFile=“SampleControl.ascx.cs“ Inherits=“SampleControl“ %>
<asp:Label ID=“Label1″ runat=“server“ Text=“Label“></asp:Label>
<asp:TextBox ID=“TextBox1″ runat=“server“></asp:TextBox>
<asp:Button ID=“Button1″ runat=“server“ Text=“Button“ />
<br />

image

Außerdem gibt es eine string property „Header“, mit der im Page_Load der Text des Labels belegt wird:

protected void Page_Load(object sender, EventArgs e)
{
Label1.Text = Header;
}

Unser Web Form besteht nur aus einem PlaceHolder und einem Button für das dynamische Laden des User Controls:

<%@ Page Language=“C#“ AutoEventWireup=“true“ CodeFile=“SampleForm.aspx.cs“ Inherits=“SampleForm“ %>
<!DOCTYPE html PUBLIC „-//W3C//DTD XHTML 1.0 Transitional//EN“ „
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd“>
<html xmlns=“
http://www.w3.org/1999/xhtml“ >
<head runat=“server“>
<title>Untitled Page</title>
</head>
<body>
<form id=“form1″ runat=“server“>
<div>
<asp:PlaceHolder ID=“PlaceHolder1″ runat=“server“></asp:PlaceHolder>
<br />
<asp:Button ID=“Button1″ runat=“server“ OnClick=“Button1_Click“ Text=“Lade SampleControl“ />
</div>
</form>
</body>
</html>

image

Um das Control dynamisch zur Laufzeit laden zu können, müssen wir die ascx-Datei in SampleForm.aspx registrieren. Dafür fügen wir die folgende Register-Direktive (z.B. unter der Page-Direktive) ein:

<%@ Register src=“SampleControl.ascx“ TagName=“SampleControl“ TagPrefix=“uc1″ %>

Das dynamische Laden des Controls wird mittels der Methode „LoadControl“ implementiert:

private void LoadSampleControl(int i)
{
SampleControl sc = (SampleControl)LoadControl(„SampleControl.ascx“);
sc.Header = „Test “ + i.ToString();
PlaceHolder1.Controls.Add(sc);
}
protected void Button1_Click(object sender, EventArgs e)
{
LoadSampleControl(++counter);
}

Das Control wird nun zur Laufzeit geladen, die Header property gesetzt und das Control zum PlaceHolder hinzugefügt. So weit – so gut. Wenn nun allerdings ein Postback erfolgt, werden die bereits in die Seite geladenen Instanzen des Sample Controls nicht automatisch geladen und damit auch nicht mehr angezeigt :-(.

Dies müssen wir im Page_Load selbst erledigen:

protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
for (int i = 0; i < counter; i++)
{
LoadSampleControl(i);
}
}
}

Fertig – das Ergebnis sieht wie folgt aus:

image

Hallo!

Ich bin beim entwickeln von dynamischen Controls grad über die Seite gestolpert und fand ein Verhalten unter VS2010 und .NET 4 ganz merkwürdig.

Die dynamisch hinzugefügten Controls verschwinden bei einem Postback nicht, sodass ich sie beim Postback nicht neu hinzufügen muss.

Kennt jemand dieses Verhalten? Wäre ja sehr praktisch, aber ich frage mich grad, wie das möglich ist…

Avatar Dorrit Riemenschneider

Hallo Seb – das war damals natürlich mit Visual Studio 2005 und .Net 2.0 – lang ist’s her…
Hab‘ mich mit dieser speziellen Thematik seither nicht mehr befasst, aber zumindest ein Tipp: Unter http://msdn.microsoft.com/en-us/library/ms178472.aspx findest Du eine in meinen Augen sehr gute Beschreibung des Page Life Cycle für .Net 4.0 – vielleicht hilft Dir das weiter.

Kommentar hinterlassen


Pin It on Pinterest