Это меня озадачило, потому что тот же код FindControl находит элемент управления, когда это не обратная передача. Вот такая ситуация.
У меня есть настраиваемый элемент управления (ClassCell.ascx). У него есть LoginView, который показывает ссылку только для людей с определенной ролью.
...
<asp:LoginView ID="LoginView1" runat="server">
<RoleGroups>
<asp:RoleGroup Roles="Instructor">
<ContentTemplate>
<a id="btnEdit" class="cssButtonPink" runat="server" href="">Edit</a>
</ContentTemplate>
</asp:RoleGroup>
</RoleGroups>
</asp:LoginView>
...
Ссылка называется btnEdit.
В моем настраиваемом элементе управления есть метод SetClass, в котором я использую FindControl, чтобы найти элемент управления btnEdit, а затем установить, на что должен указывать его href.
Public Sub SetClass
...
Dim editButton As HtmlAnchor = Me.LoginView1.FindControl("btnEdit")
If editButton IsNot Nothing Then
editButton.HRef = "~/Instructors/ManageClasses.aspx?c=" + ClassID.ToString
End If
...
End Sub
Я динамически добавляю свой настраиваемый элемент управления на этапе PreRender моей страницы Registration.aspx, и сразу после этого я вызываю его метод SetClass.
Private Sub ClassSignup_PreRender(sender As Object, e As System.EventArgs) Handles Me.PreRender
...
If IsPostBack Then
...
Else
...
End If
...
' this is where my misbehaving control is (indirectly) created '
Dim cc As New ClassCell
cc = LoadControl("~\Members\ClassCell.ascx")
cc.SetClass(objClass)
...
End Sub
Почему косвенно? На самом деле это немного сложнее, так как есть несколько вложенных настраиваемых элементов управления. Но все действие происходит в PreRender, где я указал. Я создаю настраиваемый элемент управления RoomTable. Внутри этого создаются настраиваемые элементы управления ScheduleRow, и именно в методе ScheduleRow создаются элементы управления CellClass. Я не уверен, что это вложение имеет значение.
Это отлично работает при начальной загрузке страницы, когда это не postBack. Но на главной странице также есть кнопка, с помощью которой вы можете перейти на следующую или предыдущую неделю. Вот тут-то и появляется обратная передача. И когда я просматриваю приведенный выше код в обратной передаче, я вижу, что FindControl ничего не возвращает. Я также вижу, что LoginView1.Controls.Count = 0, поэтому, похоже, это не просто рекурсивный просмотр иерархии элементов управления. Я не понимаю, почему при обратной передаче нет контроля.
И еще более странно то, что «кнопка редактирования» на самом деле отображается, но гиперссылка не активна, поскольку мой код не смог ее установить, поскольку элемент управления не может быть найден. Так что это похоже на временную привязку, когда я пытаюсь с ней работать, но нет контроля, но есть позже. Не подходящее ли время для PreRender делать это?
Заранее спасибо за помощь. Надеюсь, мне просто не хватает чего-то простого. Сандра