2009-03-27 9 views
1

この投稿は長らく残っているようです。同じリピータのItemTemplateの[次へ]/[前へ]ボタンを使用してリピータを再バインド

私はネストされたリピータを持つ親リピータを持っています。

私の問題は、私のリピーター(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 

私は私の '次へ' およびこれらconditons下の '前' リンクを管理するにはどうすればよいです。

感謝

答えて

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(); 
} 
+0

おかげで返信のための非常に。私は転記して以来これについて取り組んでおり、あなたが提案したものと同じ行動をとっています。それは長いポストであることに感謝します。 – w4ymo

関連する問題