2

2 つのリピーターがあり、一方は他方にネストされています。親リピーターのコースタイトルのリストと、子リピーターのコースの日付を出力しています。この部分は正常に動作しています。ただし、すべてのコース タイトルにいつでも利用可能な日付があるとは限らないため、現在日付のない各コース タイトルの下に、定期的に確認するようにというメッセージを表示できるようにしたいと考えています。入れ子になったリピーターのフッター テンプレートに、visibility=false を指定してラベルを配置し、ItemDataBound Sub で適切なタイミングで visibility=true を設定しようとしています。残念ながら、これは機能していません。エラーは発生していません。ラベルが表示されていません。誰かが私のコードを手伝ってくれるか、これを行う別の方法を提案してくれることを本当に望んでいます。私はaspが初めてです。net(VB) で、まだ少し苦労しています。以前にリピーターをネストしようとしたことはありません。これが私のコードです:

.aspx

<asp:Repeater ID="rptTech" runat="server" >
            <HeaderTemplate>
                <table class="tableCourses">
            </HeaderTemplate>
            <ItemTemplate>
                <tr>
                    <td>
                        <strong><asp:Label runat="server" ID="lblCourseName" Text='<%# Eval("CourseName") %>'></asp:Label></strong>
                        <br />
                        <asp:Label runat="server" ID="lblCourseSummary" Text='<%# Eval("Summary") %>'></asp:Label>
                        <br />
                        <asp:HyperLink ID="hpCourseMaterial" Visible='<%# CheckCourseMaterial(Eval("CourseMaterial")) %>' NavigateUrl='<%# "/files/Portal_Course_Material/" & Eval("CourseMaterial")%>' Text="Download Course Material" runat="server"></asp:HyperLink>
                    </td>
                </tr>
                <tr>
                    <td>
                    <asp:Repeater ID="rptTechDates" DataSource='<%#Eval("relCourses") %>' runat="server" >
                        <HeaderTemplate>
                            <table>
                        </HeaderTemplate>
                        <ItemTemplate>
                            <tr>
                                <td>
                                    <strong><asp:Label runat="server" ID="lblDate" Text='<%# CDate(Eval("dteDate")).ToString("dd/MM/yyyy") %>'></asp:Label></strong><br />
                                    <asp:Label runat="server" ID="dteTime" Text='<%# "Time: " & CDate(Eval("dteTime2")).ToString("HH:mm") & " EST" %>'></asp:Label><br />
                                    <asp:HyperLink ID="Register" NavigateUrl='<%# "/Test.aspx?intMeetingID2=" & Eval("pkWebinarID")%>' Text="Register" runat="server"></asp:HyperLink>
                                </td>
                            </tr>
                        </ItemTemplate> 
                        <FooterTemplate>
                            <tr>
                                <td>
                                    <asp:Label ID="lblNoCourses" Text="There are no course dates available at this time. Please check back regularly to see any updates." runat="server" Visible="False"></asp:Label>
                                </td>
                            </tr>
                            </table>
                        </FooterTemplate>
                    </asp:Repeater>
                    </td>
                </tr>
            </ItemTemplate>
            <FooterTemplate>
                </table>
            </FooterTemplate>
        </asp:Repeater>

コードビハインド:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Dim curDate As Date = CDate(Now)

    'Create the connection
    Dim connstring As String
    connstring = ConfigurationManager.ConnectionStrings("LPISQLConn").ConnectionString

    Using conn As New SqlConnection(connstring)
        Dim cmd As New SqlCommand("SELECT foo1, foo2, foo3 FROM tblFoo", conn)
        cmd.CommandType = CommandType.Text

        Dim ad As New SqlDataAdapter(cmd)
        Dim ds As New DataSet()
        ad.Fill(ds)
        ds.Relations.Add(New DataRelation("relCourses", ds.Tables(0).Columns("fkcrsID"), ds.Tables(1).Columns("webinarID"), False))
        rptTech.DataSource = ds.Tables(0)
        rptTech.DataBind()
    End Using
End Sub

Protected Sub rptTech_ItemDataBound(ByVal sender As Object, ByVal e As RepeaterItemEventArgs)
    If e.Item.ItemType = ListItemType.Item OrElse e.Item.ItemType = ListItemType.AlternatingItem Then
        Dim drv As DataRowView = TryCast(e.Item.DataItem, DataRowView)
        Dim rptTechDates As Repeater = TryCast(e.Item.FindControl("rptTechDates"), Repeater)
        rptTechDates.DataSource = drv.CreateChildView("relCourses")
        If rptTechDates.Items.Count < 1 And rptTechDates IsNot Nothing Then
            If e.Item.ItemType = ListItemType.Footer Then
                Dim lblNoCourses As Label = TryCast(e.Item.FindControl("lblNoCourses"), Label)
                If lblNoCourses IsNot Nothing Then
                    lblNoCourses.Visible = True
                End If
            End If
        Else
            rptTechDates.DataBind()
        End If

    End If
End Sub
4

2 に答える 2

0

私は次のことをします:

親リピーターの ItemDataBoundEvent を次のように変更します。

Protected Sub rptTech_ItemDataBound(ByVal sender As Object, ByVal e As RepeaterItemEventArgs)
  If e.Item.ItemType = ListItemType.Item OrElse e.Item.ItemType = ListItemType.AlternatingItem Then
      Dim drv As DataRowView = TryCast(e.Item.DataItem, DataRowView)
      Dim rptTechDates As Repeater = TryCast(e.Item.FindControl("rptTechDates"), Repeater)
      rptTechDates.DataSource = drv.CreateChildView("relCourses")
      rptTechDates.DataBind()
  End If
End Sub

これを子リピーターのマークアップに追加します。

OnItemDataBound="rptTechDates_ItemDataBound"

これを追加します:

Protected Sub rptTechDates_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs)
If e.Item.ItemType = ListItemType.Footer Then
  If DirectCast(DirectCast(e.Item.NamingContainer, Repeater).DataSource, DataTable).Rows.Count = 0 Then
    DirectCast(e.Item.FindControl("lblNoCourses"), Label).Visible = True
  End If
End If

したがって、子リピーターのデータソースの行数が 0 の場合は、ラベルを表示します。

OPからのコメントの後編集

Protected Sub rptTechDates_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs)
If e.Item.ItemType = ListItemType.Footer Then
  If DirectCast(DirectCast(e.Item.NamingContainer, Repeater).DataSource, DataView).Count = 0 Then
    DirectCast(e.Item.FindControl("lblNoCourses"), Label).Visible = True
  End If
End If
于 2013-04-18T08:26:37.997 に答える