2010-01-19 5 views
3

Я уверен, что этот вопрос задан в миллион раз, однако мне не удалось найти ответ, который решает мою проблему.Динамические пользовательские элементы управления ASP.NET

Я программно добавляю некоторые пользовательские элементы управления к PlaceHolder, которые у меня есть на простой странице aspx. Все пользовательские элементы управления корректно работают, за исключением тех, которые имеют Gridview.

По какой-либо причине любой ответ, который запускается из этого элемента управления, не вызывает указанное событие при первом щелчке, однако все будущие клики будут работать нормально. Я понятия не имею, почему это так, но многие решения, которые я нашел, предлагают добавить идентификатор к пользовательскому элементу ascx, но это не работает в моем случае.

Я принял взглянуть на исходный файл страницы, который получает генерируемой до и после первого щелчка, JavaScript используется для вызова изменения обратной передачи, т.е.

Перед первым щелчком мыши: OnClick = "JavaScript: __ doPostBack ('tmpControlID $ sgvPrimaryEmploymentHistory', 'Выберите $ 0')»

После первого щелчка: OnClick = "JavaScript: __ doPostBack ('OFFHome1 $ tmpControlID $ sgvPrimaryEmploymentHistory', 'Выберите $ 0')"

OFFHome1 является родителем пользовательский элемент управления, который существует на странице aspx. Все остальные элементы управления добавляются в заполнитель в этом контроле, то есть

<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="OFFHome.ascx.vb" Inherits="UmbracoUserControls.OFFHome" %> 
<asp:PlaceHolder ID="phOFFSection" runat="server"></asp:PlaceHolder> 

Ничего сложного. Затем в коде, находящемся за элементами управления, загружаются в заполнитель, используя следующее:

Опять же, ничего сверх сложного. USERCONTROLNAME - это просто константа со значением «tmpControlID».

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

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

Что я делаю неправильно?

+0

На какой части жизненного цикла страницы вы вызываете 'LoadNextOFFStep()'? –

+0

Он вызывается в Page_Load элемента управления OFFHome.ascx. т.е. Protected Sub Page_Load (ByVal отправитель As Object, ByVal е Как System.EventArgs) Ручки Me.Load Если не IsPostBack Тогда LoadNextOFFStep() Else LoadCurrentOFFStep (False) End If End Sub В LoadCurrentOFFStep выполняет аналогичная задача, однако она используется только для повторного добавления элемента управления после обратной передачи. – 2010-01-19 04:24:06

+0

@Chirs: Я удалил свой ответ, если вы задаетесь вопросом, куда он пошел. Я не думаю, что это сработает. –

ответ

1

После слишком много времени, потраченного на это, я наконец-то работал его.

Это должно было быть связано с порядком событий, но только не там, где я думал. Функция FillControl вызывалась до того, как User Control был добавлен в PlaceHolder. Я изменил это так, чтобы он вызывался после того, как User Control был добавлен в PlaceHolder, и теперь он работает в первый раз.

В основном код будет выглядеть так:

Private Sub LoadNextOFFStep() 
    Dim ControlName As String = "TestControl.ascx" 
    phOFFSection.Controls.Clear() 
    If ControlName IsNot Nothing AndAlso ControlName <> String.Empty Then 
     Dim NewControl As Object = LoadControl(ControlName) 

     With NewControl 
      .ID = USERCONTROLNAME 
      Dim AllowSkip As Boolean = .AllowSkip() 
      btnSkip.Visible = AllowSkip 
     End With 
     phOFFSection.Controls.Add(NewControl) 
     Dim StepCompleted As Boolean = CType(phOFFSection.Controls(0), Object).FillControl() 
     If StepCompleted Then 
      LoadNextOFFStep() 
      Exit Sub 
     End If 
    End If 
End Sub 

Спасибо за помощь каждого.

0

Ну ... ответ на первый вопрос прост: он не работает в первый раз, потому что идентификатор элемента управления (вернее, в сценарии обратной передачи) отличается при последующих загрузках страниц. Он работает при последующих кликах, потому что идентификатор элемента управления остается прежним.

Теперь, когда ПОЧЕМУ это ... намного сложнее! Но, вероятно, что-то связано с порядком операций здесь.

Попробуйте явно установить значение NamingContainer для NewControl:

With NewControl 
     .NamingContainer = OffHomeOne; // whatever 
     .ID = USERCONTROLNAME 
+0

Оказывается, я не могу явно указать NamingContainer, поскольку это свойство readonly. – 2010-01-19 22:37:56

+0

D'oh. Ты прав. Ну ... это определенно связано с вашей проблемой. Из любопытства вы можете назвать этот метод в Init вместо Page_Load? Любая функциональная разница? – Bryan

+0

Кажется, не имеет никакого значения. Я попытался использовать datagrid вместо gridview, и при первом щелчке сетка фактически исчезает. И в будущих кликах он работает правильно ... – 2010-01-20 04:30:56

Смежные вопросы