【问题标题】:Want to access controls in dynamically created nested repeater想要访问动态创建的嵌套中继器中的控件
【发布时间】: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 在生命周期中来不及绑定数据。内部中继器上的任何事件都不会触发,因为它在将事件连接在一起的页面生命周期部分中还不存在。

标签: asp.net vb.net repeater


【解决方案1】:

我找到了答案。我不得不改变这一行:

Dim childRepeater As Repeater = TryCast(item.FindControl("childRepeater"), Repeater)

到这里:

Dim childRepeater As WebControls.Repeater = TryCast(item.FindControl("childRepeater"), WebControls.Repeater)

【讨论】:

    【解决方案2】:

    我会在这里改变整个方法。我不会尝试更新控件,而是更新数据源,然后再次调用 bindData(),以便这些控件按照应有的方式从新数据构建。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 2023-03-07
      相关资源
      最近更新 更多