LoadControl vs Construct ASP.Net Control - PullRequest
       11

LoadControl vs Construct ASP.Net Control

9 голосов
/ 24 августа 2009

У меня есть вопрос, почему мы можем добавить только динамическое управление, используя LoadControl. Например:

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

Когда в методе page_load wucDate дочерний элемент управления wucDate имеет значение null, но при использовании следующего метода:

   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);
        }
    }

В методе page_load wucDate дочерний элемент управления wucDate не равен нулю. Кто-нибудь может объяснить мне, почему asp .net не создает дочерний элемент управления wucDate, когда я использую contructor ??? Спасибо

Ответы [ 4 ]

9 голосов
/ 24 августа 2009

При динамической загрузке пользовательского элемента управления важно убедиться, что стандартный конвейер событий страницы ASP.NET запущен и работает нормально. Когда вы используете оператор new для создания экземпляра пользовательского элемента управления, этот пользовательский элемент управления не добавляется должным образом в систему событий ASP.NET. Если события (Init, Load, PreRender и т. Д.) Не сработали, то ваше управление никогда не будет функционировать должным образом. Вот почему необходимо использовать LoadControl, поскольку это обеспечит правильное создание экземпляра пользовательского элемента управления и его подключение к ASP.NET.

4 голосов
/ 09 сентября 2009

Очевидно, что использование LoadControl с typeof (или GetType) имеет ту же проблему, что и использование 'new', когда дочерние элементы управления не инициализируются. Использование LoadControl со строкой в ​​файле ASCX работает.

Не инициализирует дочерние элементы управления.

LoadControl(typeof(MyReport), null);

Works!

LoadControl("Report.ascx");
2 голосов
/ 16 октября 2009

Инициализация элементов управления внутри пользовательского элемента управления осуществляется файлом ASCX. Использование только «нового SomeControl» не приведет к выполнению этой инициализации, и даже если это произойдет, весь дизайн (разметка) в файле ascx будет потерян.

Помните, что класс "wucDate" является только базовым классом, от которого наследуется полный пользовательский элемент управления. Это не тот класс, который вы получите при использовании LoadControl ("wucDate.ascx").

И, честно говоря, LoadControl не имеет ничего общего с жизненным циклом страницы. Эта часть обрабатывается, когда вы добавляете элемент управления в коллекцию Controls контейнера.

0 голосов
/ 24 августа 2009

Насколько я помню, это относится к тому, как ASP.NET создает компоненты страницы во время выполнения. В ASP.NET, хотя у ваших страниц есть класс, который определен в вашем файле с выделенным кодом, их типы действительно не существуют до времени выполнения. Как и страница, хотя у вас есть определенный элемент управления, тип wucDate не создается, пока он не будет включен во время выполнения. По этой причине элемент управления должен быть загружен с помощью LoadControl, чтобы как инициализировать тип, так и правильно выполнить его в течение жизненного цикла страницы.

Это в меру моей памяти, поэтому, если я здесь не прав, пожалуйста, дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...