Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

LoadControl vs Construct ASP.Net Control

I have a question why we can only add dynamic control using LoadControl. For example:

public partial class wucReportParam : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
          wucDate() ctrl = new wucDate();
          pnl.Controls.Add(ctrl);
    }
}

When in the page_load method of wucDate, the child control of wucDate is null but when i use the following method:

   public partial class wucReportParam : System.Web.UI.UserControl
    {
        public Report Report;

        protected void Page_Load(object sender, EventArgs e)
        {
              ctrl = (wucDate)LoadControl(@"Reports\wucDate.ascx");
              pnl.Controls.Add(ctrl);
        }
    }

In the page_load method of wucDate, the child control of wucDate is not null. Is anyone could explain to me why asp .net don't create any child control of wucDate when i using contructor ??? Thank you

like image 955
user85996 Avatar asked Aug 24 '09 03:08

user85996


3 Answers

When dynamically loading a user control, it is important to ensure that the standard ASP.NET page event pipeline is initiated and progresses normally. When you use the new operator to create an instance of a user control, that user control is not properly added to ASP.NET's event system. If the events (Init, Load, PreRender, etc.) to not fire, then your control will never function properly. That is why it is necessary to use LoadControl, as that will make sure that the instance of your user control is created properly and attached to ASP.NET.

like image 167
jrista Avatar answered Oct 31 '22 11:10

jrista


Apparently, using LoadControl with typeof (or GetType) has the same problem as using 'new' where the child controls are not initialized. Using LoadControl with a string to the ASCX file works.

Does not initialize child controls.

LoadControl(typeof(MyReport), null);

Works!

LoadControl("Report.ascx");
like image 43
Doug Domeny Avatar answered Oct 31 '22 10:10

Doug Domeny


The initialization of the controls inside a User Control is driven by the ASCX file. Using only "new SomeControl" will not cause this initialization to run, and even if it did, all the design (markup) in the ascx file would be lost.

Remember that the class "wucDate" is only the base class which the full user control inherits from. It's not the same class as you'll get when using LoadControl("wucDate.ascx").

And to be honest, LoadControl has not much, if anything, to do with the page life cycle. That part is handled when you add the control to the container's Controls collection.

like image 20
gliljas Avatar answered Oct 31 '22 10:10

gliljas