这让我感到困惑,因为相同的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
我在Signup.aspx页面的PreRender阶段动态添加我的自定义控件,之后,我正在调用它的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返回Nothing。我还看到LoginView1.Controls.Count = 0,所以它似乎不仅仅是通过控件层次结构递归。我不明白为什么控制不在回发上。
更奇怪的是'编辑按钮'实际呈现,但超链接未激活,因为我的代码未能设置它,因为无法找到控件。所以它几乎就像是一个计时的东西,当我试图使用它时控制不存在,但稍后会有。 PreRender是错误的时间尝试这样做吗?
提前感谢您的帮助。我希望我只是遗漏了一些简单的东西。 桑德拉
答案 0 :(得分:0)
PostBack事件处理程序比PreRender事件更早调用。您应该在Init事件上动态添加控件。
答案 1 :(得分:0)
我担心通过取消使用LoginView来解决问题。相反,我只是根据当前用户的角色添加了代码来决定是否显示链接。
If Page.User.IsInRole("Instructor") Then
btnEdit.HRef = "~/Instructors/ManageClasses.aspx?c=" + ClassID.ToString
btnEdit.Visible = True
Else
btnEdit.Visible = False
End If
非常感谢所有答案。如果有人觉得这个问题应该被删除,因为它没有真正回答,请务必告诉我,我可以将其删除。在(嵌套)用户控件中使用LoginView控件,以及在首页加载与回发时的时序/行为,显然有一些细微差别。
谢谢! 桑德拉