FindControl在回发时没有找到子控件

时间:2014-03-27 13:35:22

标签: asp.net postback findcontrol loginview

这让我感到困惑,因为相同的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是错误的时间尝试这样做吗?

提前感谢您的帮助。我希望我只是遗漏了一些简单的东西。 桑德拉

2 个答案:

答案 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控件,以及在首页加载与回发时的时序/行为,显然有一些细微差别。

谢谢! 桑德拉