2009-03-27 3 views
1

이 게시물이 길게 보인다면 죄송합니다.동일한 리피터의 ItemTemplate에서 다음/이전 버튼을 사용하여 리피터 리 바인딩

중첩 된 중계기가있는 상위 중계기가 있습니다.

제 문제는 내 중계기 (rptTabContent)와 내부 중계기를 리 바인드하기 위해 '다음'및 '이전'버튼을 사용하려고하지만 ItemCommand 이벤트 중 이러한 링크의 상태를 조작하려고 할 때 바인드로 덮어 씁니다.

그래서 '다음'또는 '이전'링크를 클릭 한 후 데이터가 없으면 버튼을 비활성화하거나 활성화 할 수 없습니다.

중첩 된 repeater는 7 개의 열에 1 주분의 데이터를 표시합니다. 다음 버튼은 다음 주 데이터와 이전 주 데이터를 표시합니다. 처음에는 이전 버튼이 비활성 상태입니다.

부모 리피터는 처음에는 데이터 테이블을 포함하는 4 개의 div를 반복하기 때문에 다시 바인딩됩니다. 하나의 리피터에서 다음 버튼 하나가 눌려지면 모든 테이블에 다음 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

당신이 확실하면 이전/다음 버튼을 네 번을해야합니까?

어쨌든 rptTabContent_ItemDataBound에서 버튼 관리를 수행하십시오. ItemCommand에서 새로운 시작점을 얻고 데이터를 가져오고 데이터를 바인딩합니다. ItemDataBound에서 다음 버튼과 이전 버튼을 가져와 현재 날짜를 기반으로 활성화 또는 비활성화 할 수 있습니다. 마크 업에서는 두 버튼 모두 기본 상태 (데이터가없는 경우)로 사용하지 않도록 설정해야합니다.

다음은 네 가지 항목의 데이터 소스를 시뮬레이트하는 작업 샘플입니다.

페이지

<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

관련 문제