2010-06-04 69 views
0

我编写了一个用户控件,捕获一些用户输入并具有Save按钮以将其保存到数据库。我使用中继器在页面上呈现多个这些控件 - 想象一下每个问题的保存按钮的多项选择问题列表。ASP.NET按钮单击未捕获(在Repeater中动态加载的用户控件中的按钮)

我加载像这样(简化代码)的直放站的ItemDataBound事件中用户控件:

Protected Sub rptAssignments_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rptAssignments.ItemDataBound 

    Dim CurrentAssignment As Assignment = DirectCast(e.Item.DataItem, Assignment) 
    Dim ctl As UA = CType(LoadControl("~\Controls\UA.ascx"), UA) 

    ctl.AssignmentID = CurrentAssignment.AssignmentID 
    ctl.Assignment = CurrentAssignment.AssignmentName 
    ctl.EnableViewState = True 

    e.Item.Controls.Add(ctl) 
End Sub 

仅供参考,我需要加载运行时的控制,而不是在ItemTemplate指定它,因为不同的控制可以用于每一行。

在用户控制,有这样一个LinkBut​​ton:

<asp:LinkButton ID="lbnUpdate" runat="server" Text="Update" OnClick="lbnUpdate_Click" /> 

...并点击一个按钮的处理程序是这样的:

Protected Sub lbnUpdate_Click(ByVal sender As Object, ByVal e As EventArgs) Handles lbnUpdate.Click 
    ' my code to update the DB 
End Sub 

的问题是,当Save按钮点击后,页面回传,但不会调用lbnUpdate_Click。但是页面本身的Page_Load事件被调用。

我应该提到中继器是用户控件的一部分,并且该用户控件被加载到另一个用户控件(这是一个大量使用用户控件的DotNetNuke站点)内。保存按钮链接如下所示:

javascript:__doPostBack('dnn$ctr498$AssignmentsList$rptAssignments$ctl04$ctl00$lbnUpdate','') 

回答

2

此问题举例说明webforms如何超出自身。

您必须通过重新绑定或从视图状态重构Repeater才能使子控件引发事件。您支付的价格要么是您的数据源的另一次旅行,要么是视图状态中存储在客户端上的所有冗余数据。可耻!

+0

耶!我在Page_Init事件中重新启动中继器,现在按钮点击会在动态加载的控件中触发。谢谢。 – Laurence 2010-06-05 19:08:57

1

我有类似的问题,一旦可能是相同的事情。

总之,由于您是动态创建按钮,回发后它们不存在。因此,当ASP.NET Webforms查找事件时,它找不到任何内容。

你的中继器什么时候得到数据绑定?尝试在回发(甚至作为测试)中再次将按钮渲染到页面,以查看这是否有效。

+0

这很有道理,谢谢。 – Laurence 2010-06-05 19:12:05

0

用户控件的ID在每个回发中是否相同?

+0

是的,他们是。我认为下面的两个答案突出了这个问题。 – Laurence 2010-06-05 19:00:16