Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden
0800 1 255 255

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) zie­hen – den Rest erle­digt Visual Studio für uns.Wenn man das Gleiche dyna­misch zur Laufzeit errei­chen möchte (weil man z.B. unter­schied­li­che ascx-Dateien ver­wen­den oder ein­und­die­selbe ascx-Datei mehr­mals nach­ein­an­der laden will), kann man das fol­gen­der­ma­ß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 pro­perty "Header", mit der im Page_Load der Text des Labels belegt wird:

pro­tec­ted void Page_Load(object sen­der, EventArgs e)
{
Label1.Text = Header;
}

Unser Web Form besteht nur aus einem PlaceHolder und einem Button für das dyna­mi­sche 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 dyna­misch zur Laufzeit laden zu kön­nen, müs­sen wir die ascx-Datei in SampleForm.aspx regis­trie­ren. Dafür fügen wir die fol­gende Register-Direktive (z.B. unter der Page-Direktive) ein:

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

Das dyna­mi­sche Laden des Controls wird mit­tels der Methode "LoadControl" implementiert:

pri­vate void LoadSampleControl(int i)
{
SampleControl sc = (SampleControl)LoadControl("SampleControl.ascx");
sc.Header = "Test " + i.ToString();
PlaceHolder1.Controls.Add(sc);
}
pro­tec­ted void Button1_Click(object sen­der, EventArgs e)
{
LoadSampleControl(++counter);
}

Das Control wird nun zur Laufzeit gela­den, die Header pro­perty gesetzt und das Control zum PlaceHolder hin­zu­ge­fügt. So weit – so gut. Wenn nun aller­dings ein Postback erfolgt, wer­den die bereits in die Seite gela­de­nen Instanzen des Sample Controls nicht auto­ma­tisch gela­den und damit auch nicht mehr angezeigt :-(.

Dies müs­sen wir im Page_Load selbst erledigen:

pro­tec­ted void Page_Load(object sen­der, EventArgs e)
{
if (IsPostBack)
{
for (int i = 0; i < coun­ter; i++)
{
LoadSampleControl(i);
}
}
}

Fertig – das Ergebnis sieht wie folgt aus:

image

Related Posts

Hallo!

Ich bin beim ent­wi­ckeln von dyna­mi­schen Controls grad über die Seite gestol­pert und fand ein Verhalten unter VS2010 und .NET 4 ganz merkwürdig.

Die dyna­misch hin­zu­ge­füg­ten Controls ver­schwin­den bei einem Postback nicht, sodass ich sie beim Postback nicht neu hin­zu­fü­gen muss.

Kennt jemand die­ses Verhalten? Wäre ja sehr prak­tisch, aber ich frage mich grad, wie das mög­lich ist…

Avatar Dorrit Riemenschneider

Hallo Seb – das war damals natür­lich mit Visual Studio 2005 und .Net 2.0 – lang ist's her…
Hab' mich mit die­ser spe­zi­el­len Thematik seit­her nicht mehr befasst, aber zumin­dest ein Tipp: Unter http://msdn.microsoft.com/en-us/library/ms178472.aspx fin­dest Du eine in mei­nen Augen sehr gute Beschreibung des Page Life Cycle für .Net 4.0 – viel­leicht hilft Dir das weiter.

Comments are closed.

Pin It on Pinterest