1

この投稿が長蛇の列になっているようでしたら申し訳ありません。

ネストされたリピーターを持つ親リピーターがあります。

私の問題は、「次へ」ボタンと「前へ」ボタンを使用してリピーター(rptTabContent)を再バインドしようとしているため、内部リピーターも再バインドしようとしていますが、ItemCommandイベント中にこれらのリンクの状態を操作しようとすると、練る。

そのため、「次へ」または「前へ」のリンクをクリックした後にデータがない場合、ボタンを無効または有効にすることはできません。これは、私がやろうとしていることです。

ネストされたリピーターは、7列に1週間分のデータを表示します。次のボタンは、次の週のデータと前の週のデータを表示するためのものです。最初は、前のボタンは非アクティブです。

親リピーターは、最初はそれぞれがデータのテーブルを含む4つのdivをループアウトするため、再びバインドされます。1つのリピーターで次のボタンを1つ押すと、すべてのテーブルに次の7日間のデータが表示される必要があります。

各リピーターには、まったく同じ数のアイテムがあります。

最初にページロード時に、すべてのデータが正しくバインドされます。

コレクションの最初のアイテムと最後のアイテムの日付がわかっているので、親リピーターにバインドする必要のあるオブジェクトの日付範囲を計算できます。

HTMLは以下のとおりです

        <asp:Repeater ID="rptTabContent" runat="server" OnItemCommand="rptTabContent_ItemCommand">
        <ItemTemplate>
            <div id="<%# Eval("SlotTypeUrl") %>" class="delivery-timetable-container">
                <table cellpadding="0" cellspacing="0" border="0">
                    <asp:Repeater ID="rptDeliverySlots" runat="server">
                        <ItemTemplate>
                            <tr class="time-slots">
                                <th><asp:Label id="lblRowTime" runat="server"></asp:Label></th>
                                <asp:Repeater ID="rptDeliverySlot" runat="server">
                                    <ItemTemplate>
                                        <td id="tdDay" runat="server">
                                            <cc1:RepeaterRadioButton id="rptrdoDeliverySlot" groupname="del-times" runat="server" />
                                        </td>           
                                    </ItemTemplate> 
                                </asp:Repeater>                            
                            </tr>
                        </ItemTemplate>
                    </asp:Repeater>
                    <tr>
                        <td colspan="8">&nbsp;</td>
                    </tr>
                    <tr>
                        <td colspan="4">            
                                <div class="eco-rollover">
                                    <div>
                                        <img src="icon.gif" />
                                    </div>
                                </div>
                        </td>
                        <td colspan="4">
                            <asp:LinkButton id="lnkPreviousWeek" enabled="false"  runat="server" commandargument="Previous" cssclass="inactive">&lt; Previous week</asp:LinkButton>|
                            <asp:LinkButton id="lnkNextWeek" runat="server" commandargument="Next" cssclass="active" >Next week &gt;</asp:LinkButton>
                        </td>
                    </tr>
                </table>
            </div>
        </ItemTemplate>
    </asp:Repeater>

私のItemCommandイベントはここにあります:

Protected Sub rptTabContent_ItemCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterCommandEventArgs) 
    If (e.Item.ItemType = ListItemType.Item) Or (e.Item.ItemType = ListItemType.AlternatingItem)
        Dim filteredProposedDeliveries  As New List(Of ProposedDeliverySlotDTO)
        Dim firstDate, lastDate As Date
        Dim startDate, endDate  As Date

        If (Session("FirstDeliveryDate") IsNot Nothing) AndAlso (Session("LastDeliveryDate") IsNot Nothing) Then

            firstDate = CType(Session("FirstDeliveryDate"), Date)
            lastDate  = CType(Session("LastDeliveryDate"),  Date) 

            Select Case e.CommandArgument.ToString()
                Case "Next"    
                    'Get new startDate using firstDate and store to use next time
                    'disable next button if startDate > lastDate
                Case "Previous"
                    'Get new startDate from current displayed date and overright stored startdate
                    'disable previous button if startDate < firstDate
            End Select

            endDate = startDate.AddDays(7)     

        End If

        'filteredProposedDeliveries = Get object between startDate and EndDate

        Dim slots As List(Of SlotType)  = PrepareSlotsForBinding(filteredProposedDeliveries)            

        Dim rptTabContent As Repeater = CType(e.Item.BindingContainer, Repeater)
        rptTabContent.DataSource = slots
        rptTabContent.DataBind()
    End If
End Sub

これらの条件下で「次へ」および「前へ」のリンクを管理するにはどうすればよいですか。

どうもありがとう

4

1 に答える 1

2

次へ/前へのボタンが 4 回必要ですか?

とにかく、rptTabContent_ItemDataBound でボタン管理を行ってください。ItemCommand では、新しい開始点を取得し、データを取得してデータ バインドを行います。ItemDataBound では、[次へ] ボタンと [前へ] ボタンを取得し、現在の日付に基づいて有効または無効にします。両方のボタンは、既定の状態としてマークアップで無効にする必要があります (データがない場合)。

以下は、4 つの項目のデータ ソースをシミュレートする実際のサンプルです。

ページ

<asp:Repeater ID="Repeater1" runat="server" onitemcommand="Repeater1_ItemCommand" onitemdatabound="Repeater1_ItemDataBound">
    <ItemTemplate>
        <div>
            Label: <asp:Label ID="itemLabel" runat="server"></asp:Label><br />
            <asp:LinkButton id="lnkPreviousWeek" Enabled="false" runat="server" commandargument="Previous" cssclass="inactive">&lt; Previous week</asp:LinkButton>&nbsp;|&nbsp;
            <asp:LinkButton id="lnkNextWeek" Enabled="false" runat="server" commandargument="Next" cssclass="active" >Next week &gt;</asp:LinkButton>
            <hr />
        </div>
    </ItemTemplate>
</asp:Repeater>

コード

private int current = 1;

protected void Page_Load(object sender, EventArgs e)
{
    if (ViewState["current"] == null)
        ViewState["current"] = current;
    else
        current = (int)ViewState["current"];

    if (!IsPostBack)
    {
        Repeater1.DataSource = GetData(current);
        Repeater1.DataBind();
    }
}

private List<int> GetData(int start)
{
    //pseudo data; simulates a page of 2 records
    List<int> ds = new List<int>();
    ds.Add(start);
    ds.Add(start + 1);

    return ds;
}

protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
{
    if ((string)e.CommandArgument == "Next")
        current++;
    else if ((string)e.CommandArgument == "Previous")
        current--;

    ViewState["current"] = current;

    Repeater1.DataSource = GetData(current);
    Repeater1.DataBind();
}

protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    LinkButton prev = (LinkButton)e.Item.FindControl("lnkPreviousWeek");
    LinkButton next = (LinkButton)e.Item.FindControl("lnkNextWeek");

    //here 1 and 3 are artificial boundaries for data for the sake of example
    if (current > 1)
        prev.Enabled = true;
    if (current < 3)
        next.Enabled = true;

    Label label = (Label)e.Item.FindControl("itemLabel");
    label.Text = e.Item.DataItem.ToString();
}
于 2009-03-27T14:35:54.323 に答える