【发布时间】:2020-12-09 08:19:17
【问题描述】:
我已经四处搜索了解决方案,并逐步完成了我的代码,但我似乎无法在按钮单击事件中找到我的 childRepeater。该按钮位于 familyRepeater 的页脚中,如果这对这个问题很重要的话。
childRepeater 是在后面的代码中动态创建的。
这是我的点击事件:
Protected Sub EnrollAllButton_Click(sender As Object, e As EventArgs)
familyRepeater.DataSource = Session("Families")
familyRepeater.DataBind()
For Each item As RepeaterItem In familyRepeater.Items
If (item.ItemType = ListItemType.Item OrElse item.ItemType = ListItemType.AlternatingItem) Then
' this never finds childRepeater. It is null for every item
Dim childRepeater As Repeater = TryCast(item.FindControl("childRepeater"), Repeater)
If childRepeater IsNot Nothing Then
For Each child As RepeaterItem In childRepeater.Items
Dim radio1 As RadioButtonList = CType(child.FindControl("AttendanceRBL"), RadioButtonList)
radio1.Items.FindByText("Enrolled").Selected = True
Next
End If
End If
Next
End Sub
我缺少什么来获取子中继器及其控件?当我在浏览器中检查页面时,我可以深入到子中继器并查看那里的所有子控件。
这是我的 aspx 页面:
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Repeater.aspx.vb" Inherits="RepeaterSample.Repeater" enableEventValidation="false" %>
<%@ Import Namespace="System.Data" %>
<html>
<head runat="server">
<title></title>
<link href="~/StyleSheet1.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form runat="server">
<div id="NestedRepeaters">
<p>Repeater: </p>
<p>Family: <asp:Label ID="familyMsg" runat="server" Text="ViewMode"></asp:Label></p>
<p>Child: <asp:Label ID="childMsg" runat="server" Text=""></asp:Label></p>
<!-- begin parent repeater -->
<asp:Repeater ID="familyRepeater" runat="server" OnItemCommand="familyRepeater_ItemCommand" >
<HeaderTemplate>
<table >
<tr>
<th colspan="4"><asp:Label runat="server" Text="Last Name, First Name, M.I." Font-Bold="true" Width="300"></asp:Label></th>
<th><asp:Label runat="server" Text="FICN" Font-Bold="true" Width="100"></asp:Label></th>
<th><asp:Label runat="server" Text="Program Code" Font-Bold="true" Width="100"></asp:Label></th>
<th colspan="2"><asp:Label runat="server" Text="Attendance Status" Font-Bold="true" Width="200"></asp:Label></th>
<th><asp:Label runat="server" Text="Update" Font-Bold="true" Width="80"></asp:Label></th>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr class="spaceAbove">
<td><b>Family:</b></td>
<td colspan="3"><%# DataBinder.Eval(Container.DataItem, "FamilyName") %></td>
<td><%# DataBinder.Eval(Container.DataItem, "FICN") %> </td>
<td></td>
<td></td>
<td></td>
<td style="text-align: center;">
<asp:LinkButton ID="editFamily" runat="server" Text="Edit Family" OnClick="OnEdit" CommandName="EditFamily" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "FamilyID") %>' ></asp:LinkButton>
<asp:LinkButton ID="updateFamily" Text="Update" runat="server" Visible="false" OnClick="OnUpdate" CommandName="UpdateFamily"/>
<asp:LinkButton ID="cancelFamily" Text="Cancel" runat="server" Visible="false" OnClick="OnCancel" CommandName="CancelFamily" />
</td>
</tr>
<!-- begin child repeater -->
<asp:Repeater ID="childRepeater" runat="server" OnItemDataBound="ChildRepeater_ItemDataBound" DataSource='<%# (CType(Container.DataItem, DataRowView)).Row.GetChildRows("FamilyChildRelation") %>' OnItemCommand="ChildRepeater_ItemCommand" >
<ItemTemplate>
<tr>
<td></td>
<td colspan="4" style="vertical-align: top;">Child: <asp:Label runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "ChildName") %>' />
</td>
<td style="text-align: center;">
<asp:PlaceHolder ID="programPlaceHolder" runat="server" ></asp:PlaceHolder>
</td>
<td style="text-align: center;">
<asp:PlaceHolder ID="attendancePlaceHolder" runat="server" ></asp:PlaceHolder>
</td>
<td></td>
<td ></td>
</tr>
</ItemTemplate>
</asp:Repeater>
<!-- end child repeater -->
</ItemTemplate>
<FooterTemplate>
<td colspan ="4" style="text-align: center; ">
<asp:button ID="EnrollAllButton" runat="server" text="Enroll All" OnClick="EnrollAllButton_Click" />
<asp:button ID="AttendAllButton" runat="server" text="Attend All" OnClick="AttendAllButton_Click" />
</td>
</table>
</FooterTemplate>
</asp:Repeater>
<!-- end parent repeater -->
</div>
</form>
</body>
</html>
这是我的页面加载和绑定代码:
Public Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
bindData()
If Not IsPostBack Then ' Do this for first time page loads
familyRepeater.DataSource = Session("Families")
familyRepeater.DataBind()
End If
End Sub
Private Sub bindData()
'test data
Dim RptYrMo As String = "202007"
Dim agency As Integer = 879
Dim subAgencyCode As String = "000"
Dim familiesDataSet As DataSet = New DataSet()
' Fill data tables for families, children, and settings
dtFamilies = Attendance.GetFamilies(RptYrMo, agency, subAgencyCode)
dtChildren = Attendance.GetChildren(RptYrMo, agency, subAgencyCode)
'Add data tables to data set
familiesDataSet.Tables.Add(dtFamilies)
familiesDataSet.Tables.Add(dtChildren)
'Add relationship
familiesDataSet.Relations.Add("FamilyChildRelation", familiesDataSet.Tables("Families").Columns("FamilyID"), familiesDataSet.Tables("Children").Columns("FamilyID"))
'Bind the data set
familyRepeater.DataSource = familiesDataSet.Tables("Families")
familyRepeater.DataBind()
Session("Families") = familiesDataSet.Tables("Families")
End Sub
感谢您的宝贵时间。
【问题讨论】:
-
您致电
familyRepeater.DataBind(),然后开始寻找子中继器。如果您动态创建它,则需要在每次页面加载(包括 PostBack)或在父级上调用 DataBind 之后重新创建它。 -
@VDWWD 我确实在活动开始时致电
familyRepeater.DataBind()。 -
我在原始帖子中添加了更多代码
-
Page_Load 在生命周期中来不及绑定数据。内部中继器上的任何事件都不会触发,因为它在将事件连接在一起的页面生命周期部分中还不存在。