ASP.NET
How to: Create Instances of ASP.NET User Controls Programmatically

Just as you can programmatically create an instance of any server control on an ASP.NET Web page, you can do the same with a user control.

To create an instance of a user control programmatically

  1. In the user control, be sure that the @ Control directive contains a ClassName attribute that assigns a class to the user control.

    The following example sets the ClassName attribute to strongly type a user control.

    <%@ Control className="MyUserControl" %>
    
  2. In the page where you want to work with the user control, create a reference to the user control with the @ Reference directive.

    When you create the user control programmatically, the strong type for your user control is available to the ASP.NET Web page only after you have created a reference to it. For example, the following code creates a reference to a user control created in the MyUserControl.ascx file.

    <%@ Reference Control="MyUserControl.ascx" %>
    
    NoteNote:

    You use the @ Reference when you intend to load the control programmatically. You use the @ Register directive when you add a user control to the page declaratively. For details, see How to: Include a User Control in an ASP.NET Web Page.

  3. Create an instance variable for the user control, using the control's class name. The class will be part of the ASP namespace.

    For example, if you want to create an instance of the user control declared as class Spinner, you use syntax such as the following:

    Visual Basic
    Protected Spinner1 As ASP.Spinner

    C#
    Protected ASP.Spinner Spinner1;
  4. Create an instance of the user control in code by calling the LoadControl method.

  5. Assign property values as necessary, and then add the control to the ControlCollection collection of a container on the page, such as a PlaceHolder control.

    NoteNote:

    When you add controls to the ControlCollection object using the Add method, they are placed in the collection in the order they are processed. If you want to add a control to a specific position in the collection, use the AddAt method and specify the index location where you want to store the control.

Example

The following example shows an ASP.NET Web page that loads a user control programmatically. The page includes an @ Reference directive to specify the control's file. The LoadControl method reads the file and instantiates it as a control that can be added to the page.

Visual Basic
<%@ Page Language="VB" %>
<%@ Reference Control="~\Controls\Spinner.ascx" %>

<script runat="server">
Private Spinner1 As ASP.Spinner
Protected Sub Page_Load(ByVal sender As Object, _
        ByVal e As System.EventArgs)
    Spinner1 = CType(LoadControl("~\Controls\Spinner.ascx"), _
        ASP.Spinner)
End Sub

Protected Sub Button1_Click(ByVal sender As Object, _
      ByVal e As System.EventArgs)
    PlaceHolder1.Controls.Add(Spinner1)
End Sub
</script>
<html>
<head id="Head1" runat="server">
  <title>Load User Control Programmatically</title>
</head>
<body>
  <form id="form1" runat="server">
    <div>
      <asp:PlaceHolder runat=server ID="PlaceHolder1" />
      <br />
      <asp:Button ID="Button1" runat="server" 
        Text="Button" 
        OnClick="Button1_Click" />
      <br />
      <br />
      <asp:Label ID="Label1" runat="server" Text=""></asp:Label>
    </div>
  </form>
</body>
</html>
 [C#]
<%@ Page Language="C#" %>
<%@ Reference Control="~/Controls/Spinner.ascx" %>    
<script runat="server">
private ASP.Spinner Spinner1
 
protected void Page_Load(object sender, EventArgs e)
{
   Spinner1 = (ASP.Spinner)LoadControl("~/Controls/Spinner.ascx");  
}

protected void Button1_Click(object sender, EventArgs e)
{
   PlaceHolder1.Controls.Add(Spinner1);   
}
</script>

<html>
<head id="Head1" runat="server">
  <title>Load User Control Programmatically</title>
</head>
<body>
  <form id="form1" runat="server">
    <div>
      <asp:PlaceHolder runat="server" ID="PlaceHolder1" />
      <br />
      <asp:Button ID="Button1" runat="server" 
        Text="Click to Add User Control" 
        OnClick="Button1_Click" />
      <br />
      <br />
      <asp:Label ID="Label1" runat="server" Text=""></asp:Label>
    </div>
  </form>
</body>
</html>
See Also

Concepts

Tags :


Community Content

Dany651
This works in NET 3.5 but only for 'Web Site Project Type'

The 'Creating Instances of ASP.NET User Controls Programmatically' technique does work in NET 3.5, but only if you create an ASP.NET website using the 'web site project type' (File -> New -> Website) insted of the 'web application project type' (Create: Project... web project), which is the default project type in Visual Studio 2008.

The Web application project model lets you create a Web application whose structure and build semantics closely resemble the project model introduced with Visual Studio .NET 2003 applications. The default Web site project model uses the directory structure to define the contents of the project. In this model, there is no project file, and all files in the directory are part of the project.

The types under (File -> New -> Website) are a relatively older type of project which is based strictly on the file system contents (i.e. no project file). You can create one of these on your local file system, but the largest benefit is that you can create/open websites that are located on an IIS server or via an FTP connection to a hosting service.

The types under (File -> New -> Project) are based on the same project system used by other projects, were you have a .csproj or .vbproj file that keeps track of the contents of your project. These web applications are compiled before deploying (which has some benefits and drawbacks), but are developed on your local machine until you deploy them. They can be deployed through Visual Studio's Copy Web Site or Publish Web Site tools, or with the Web Deployment Project add-in.

Tags :

thePrisoner06
Works for me!
The concept of adding user controls dynamically works in either project type. Perhaps the comment above is referring the @Control directive. Haven't tried that one yet.
Tags :

Thomas Lee
Hard coded @ Reference?

Doesn't having to hard code a @reference command defeat the whole purpose of being able to programatically load user controls in the code behind. If you have 100 controls and only 1 is to be used you have to have all 100 references hard coded into the html to programatically us the one control you really want? Come on MicrosoftCommunications Documentation.
[tfl 10 07 09] Hi - and thanks for your post. You should post questions like this to the MSDN Forums at http://forums.microsoft.com/msdn or the MSDN Newsgroups at

http://www.microsoft.com/communities/newsgroups/en-us/ . You are much more likely get a quicker response using the forums than through the Community Content. For specific help about:
Visual Studio :
http://groups.google.com/groups/dir?sel=usenet%3Dmicrosoft.public.vstudio%2C &
SQL Server :
http://groups.google.com/groups/dir?sel=usenet%3Dmicrosoft.public.sqlserver%2C &
.NET Framework :
http://groups.google.com/groups/dir?sel=usenet%3Dmicrosoft.public.dotnet.framework
All Public : http://groups.google.com/groups/dir?sel=usenet%3Dmicrosoft.public%2C &


Page view tracker