【问题标题】:FindControl not finding child control on postbackFindControl 在回发时找不到子控件
【发布时间】:2014-05-06 12:37:18
【问题描述】:

这让我感到困惑,因为当它不是回发时,相同的 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 是否是尝试这样做的错误时机?

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

【问题讨论】:

  • 什么时候调用 FindControl ?如果它在 PreRender 之前(您添加按钮的位置),那么它不会找到它,因为它还没有被实例化。
  • 你需要重新绑定它才能重新渲染。
  • @Sandra 你能改一下ASP.Net HyperLink服务器控件再测试一下吗?
  • @Michael - 希望我的编辑澄清。这一切都在 PreRender 期间进行。
  • @MMK - 这个建议听起来很有希望。但是你能澄清你所说的重新绑定是什么意思吗?它不是绑定控件。

标签: asp.net postback findcontrol loginview


【解决方案1】:

PostBack 事件处理程序在 PreRender 事件之前被调用。您应该在 Init 事件上动态添加控件。

【讨论】:

  • 如果您需要访问 Viewstate,您可能需要 Load 事件
  • @Ivan - 我需要在开始显示课程表之前处理 PostBack,因为它是前一周/下一周按钮的处理程序,它设置要显示的课程日期。我尝试将我的 PreRender 代码移动到 Init,但是当我更改周数时,它就无法正常工作了。
  • @Michael - 我不使用任何 ViewState,只使用会话中的几个变量。我之前尝试过加载,但它似乎发生在处理上一周/下周按钮按下之前,所以一周实际上并没有改变,并且呈现了同一周的日程安排。
【解决方案2】:

恐怕我通过取消使用 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 控件及其在首页加载与回发时的时间/行为存在一些细微差别。

谢谢! 桑德拉

【讨论】:

    猜你喜欢
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    相关资源
    最近更新 更多