2009-04-20 2 views
2

У меня есть FindControl в OnLoad случае найти свою кнопку на странице, а именно:FindControl не работает с тегом сервера привязки, почему?

protected override void OnLoad(EventArgs e) 
{ 
    DataBind(); 
    control button = Page.FindControl("myButton"); 
} 

на моей странице ASPX я имею

<asp:Button runat="server" ID="myButton" /> 

Если у меня есть только это, все работает, когда я прохожу в кнопка OnLoad не равна null, и я могу выполнить то, что хочу. Проблема заключается в том, когда я добавить динамический текст в моей ASPX:

<asp:Button runat="server" ID="myButton" Text='<%# "Here is my dynamic text pulled from a XML" %>' /> 

Тогда FindControl ничего не находит, а кнопка является недействительным.

Добавление тега связующего сервера в aspx не означает, что нужно откладывать что-либо в порядке? Когда я проверяю объект страницы, у меня есть некоторые элементы управления в коллекции Controls, но я не могу найти myButton.

Любая идея о том, что я делаю неправильно?

EDIT

Люди, кажется, думают, что мой пример кода мой реальный код, но не, поэтому я использую FindControl, потому что мне нужно, так как у меня есть вложенные элементы управления, и я не могу получить доступ к нему напрямую и я использую привязку, потому что динамический текст, который я помещаю, находится внутри ContentTemplate, который я могу переопределить на другой странице aspx.

Вопрос, который я задал, более конкретен в том, что я проследил проблему, когда мой FindControl возвращает null, потому что новое поведение реализации является привязкой.

Улучшение примера кода не является решением или объяснением того факта, что если я положил на моей странице aspx тег <% #%>, то FindControl в событии OnLoad возвращает null.

EDIT 2

привязка тегов в одиночку, кажется, не может быть виновником, но и DataBind(), чтобы заполнить их. Независимо от того, есть ли у меня привязанный тег, помещая DataBind(), прежде чем FindControl сделает myButton равным нулю. Была сделана коррекция в примере кода.

ответ

1

In here MSDN говорит, что:

PreRender: Каждые данные связаны управления которого DataSourceID свойство установлено, вызывает метод DataBind.

Похоже, что вы не используете DataSourceID вашего связанного с данными контроля, но перемещение вашего кода FindControl в событие PreRender может помочь.

+0

Правильно, что работает движущийся код в Pre-Render, это означает, что мой шаблон DataSource не заполняется перед вызовом DataBind, поэтому myButton не найден. Не вызывая DataBind, пусть перезагрузка контроллера из viewstate и поэтому не является нулевым. Повторное применение DataSource моего шаблона перед моим FindControl или перемещение Find-Control после предварительного рендеринга исправить мою проблему. Был скорее похож на проблему кода 18, но не понял, что это было. Спасибо – 2009-04-20 20:39:18

0

Если вы хотите получить доступ к кнопке на вашей странице, вы можете напрямую обратиться к кнопке, как -

this.myButton 

И насколько присваивание значений, то, вы можете сделать это, как это в коде сервера -

this.myButton.Text = "Dynamic Text"; 

<% # хуг%> только используется, когда вы привязки данных элементов управления, например, для в DataGrid, GridView и т. д.

+0

Почему вы используете «это» в этой ситуации? – TStamper

+0

Не относящийся к заголовку вопроса, я использую FindControl из-за наследования, у меня нет прямого доступа к элементу управления. Пример должен был показать проблему, которую я проследил, а не полный код. Я не хотел, чтобы люди указывали на другие вещи, кроме того, что я представил, так как я уже сузил свою проблему до этой конкретной комбинации FindControl и тега <%# %>. – 2009-04-20 18:48:58

0

В вашем переопределении вы не хотите сначала вызвать base.OnLoad (e) в свой метод?

+0

Я вызываю base.Onload в моем коде, приведенный пример должен был только заполнить мое объяснение моей проблемы. Я отредактировал мой вопрос, чтобы прояснить это. – 2009-04-20 18:44:54

+0

Возможно, вы могли бы опубликовать полный пример. FindControl работает очень хорошо в шаблонных связанных элементах управления. – Mcbeev

+0

asp: Содержимое, насколько мне известно, не связано с шаблоном. Полный пример: 2000 строк кода между 6 страницами и для простоты должны быть сужены, и поэтому мой пример кода является самым простым объяснением. – 2009-04-20 19:13:15

1

Метод Page.FindControl() будет выполнять поиск только коллекции imediate элементов управления, связанных с страницей. Он не будет обрабатывать все дерево управления, поэтому, если ваша кнопка содержится в другом элементе управления, она не будет найдена. Вам нужно будет вызвать метод FindControl для содержащего элемента управления.

+0

FindControl работает правильно, когда я не DataBind(). Страница - мой контрольный элемент. – 2009-04-20 20:19:38