Какая разница в поведении между непосредственным добавлением элемента управления на страницу ASPX, программной загрузкой элемента управления и добавлением заполнителя? - PullRequest
1 голос
/ 01 декабря 2008

Есть ли разница в поведении между непосредственным добавлением элемента управления на страницу ASPX, программной загрузкой элемента управления и добавлением заполнителя?

Элемент управления наследуется от System.Web.UI.WebControls.DataBoundControl.

Причина, по которой я спрашиваю, заключается в том, что у меня есть элемент управления, который работает, когда я добавляю его на страницу ASPX следующим образом:

...
<blah:GoogleMap ID="GoogleMap1" runat="server" Width="640px" Height="600px" ... DataSourceID="_odsMarkers" DataAddressField="Address" DataTextField="Description">
</blah:GoogleMap>
...

Но не тогда, когда я использую следующее на странице кода:

GoogleMap map = (GoogleMap)this.LoadControl(typeof(GoogleMap), new object[] { });
//... set properties
this.placeholder1.Controls.Add(map); //add to placeholder

У кого-нибудь есть идеи, почему это может иметь место?

Ответы [ 6 ]

3 голосов
/ 01 декабря 2008

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

Вы можете посмотреть, как ASP.NET компилирует aspx:

C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files

Может возникнуть проблема с моментом добавления элемента управления на страницу. Обычный шаблон - добавить элемент управления в перегрузку метода CreateChildControls. Если элемент управления должен разрешать viewstate, вы должны убедиться, что он вызывается во время init, например, вызывая EnsureChildControls.

Добавление подсказки отладки ниндзя. Имеет ли это какое-то значение, если вы добавите метку таким же образом. Это появляется?

2 голосов
/ 01 декабря 2008

Это пользовательский элемент управления или серверный элемент управления?

Если это пользовательский элемент управления, они должны загружаться по их пути, а не по их типу:

GoogleMap map = (GoogleMap)this.LoadControl("~/Controls/GoogleMap.ascx");

Если это управление сервером, вы можете просто создать новый экземпляр:

GoogleMap map = new GoogleMap();

после того, как у вас есть экземпляр и вы добавите его в дерево элементов управления (вставив его в PlaceHolder), он должен работать так же, как если бы он был объявлен в разметке.

1 голос
/ 01 декабря 2008

Если элемент управления требует использования viewstate, вы должны убедиться, что он добавлен на страницу ПЕРЕД событием Page_Load, в противном случае viewstate не будет заполнено, и наиболее вероятные события и другие элементы будут работать неправильно.

1 голос
/ 01 декабря 2008

«Работы» довольно неоднозначны, но если вы имеете в виду, что обработчики событий никогда не выполняются, вам нужно загрузить их в событие загрузки страницы.

1 голос
/ 01 декабря 2008

Если вы устанавливаете свойства вне вызова LoadControl, почему вы создаете этот новый пустой массив объектов, а не просто используете перегрузку с одним параметром?

Кроме того, если вы присоединяете к нему отладчик и проходите через него, замечаете ли вы что-нибудь странное в этом элементе управления перед тем, как выполнить вызов Controls.Add ()? Есть ли исключение? если да, то какой? если нет, то как выглядит разметка в браузере для местозаполнителя?

0 голосов
/ 09 мая 2012

Одно важное отличие состоит в том, что если вы создаете элемент управления динамически, по умолчанию вы не получите никаких значений из набора скинов. Вы должны вручную вызвать control.ApplyStyleSheetSkin (page): http://msdn.microsoft.com/en-us/library/system.web.ui.control.applystylesheetskin.aspx

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