2017-08-30 20 views
0

這是我的C#後端:C#/ ASP.NET嵌套Repeater確實發生了改變列表與新的母公司

protected void Page_Load(object sender, EventArgs args) 
     { 

      CaseEnt MyCase = McHenryLib.ICISAdapters.CaseAdapter.GetCaseRecordForCaseNumber(Globals.CaseNum); 
      List<Charge> charges = McHenryLib.ICISAdapters.ChargeAdapter.GetByCaseNumber(Globals.CaseNum); 

      rptChg.DataSource = charges; 
      rptChg.DataBind(); 

     } 

     protected void rptChg_ItemDataBound(object sender, RepeaterItemEventArgs e) 
     { 
      CaseEnt MyCase = McHenryLib.ICISAdapters.CaseAdapter.GetCaseRecordForCaseNumber(Globals.CaseNum); 
      List<Charge> charges = McHenryLib.ICISAdapters.ChargeAdapter.GetByCaseNumber(Globals.CaseNum); 

      if (charges != null && charges.Count > 0) 
      { 
       List<Sentence> sentences = new List<Sentence>(); 

       foreach (Charge chg in charges) 
       { 
        Repeater rptSen = (Repeater)(e.Item.FindControl("rptSen")); 

        sentences.AddRange(McHenryLib.ICISAdapters.SentenceAdapter.GetByChargeObjectID(chg.ChargeObjectID)); 

        if (sentences != null && sentences.Count > 0) 
        { 
         List<SentenceDisposition> disps = new List<SentenceDisposition>(); 

         foreach (Sentence sen in sentences) 
         { 

          Repeater rptDisp = (Repeater)(e.Item.FindControl("rptDisp")); 
          disps.AddRange(McHenryLib.ICISAdapters.SentenceDispositionAdapter.GetDispositionsBySentenceOID(sen.SentenceID)); 

          rptDisp.DataSource = disps; 
          rptDisp.DataBind(); 
         } 
        } 

        rptSen.DataSource = sentences; 
        rptSen.DataBind(); 
       } 
      } 
     } 

這是我的ASP.NET前端:

<asp:Repeater ID="rptChg" runat="server" OnItemDataBound="rptChg_ItemDataBound"> 
<ItemTemplate> 
<br /> 

<table class="chg"> 
    <tr> 
     <th>Count <%#Eval("Counts") %></th> 
    </tr> 
</table> 

<!--Builds the Charges Table--> 
<table class="chg"> 
    <tr> 
     <th>Charge Date</th> 
     <th>Statute</th> 
     <th>Description</th> 
     <th>Disposition/Manner</th> 

    </tr> 
    <tr> 
     <td><%#Eval("ChargeDate")%></td> 
     <td><%#Eval("Statute")%></td> 
     <td><%#Eval("StatuteDesc")%></td> 
     <td><%#ChgCode(Eval("Disposition"))%></td> 
    </tr> 
</table> 

<!--Builds the Sentences Table--> 
<table class="sen"> 
    <asp:Repeater ID="rptSen" runat="server"> 
     <HeaderTemplate> 
      <th colspan="3">Sentences</th> 
     </HeaderTemplate> 
     <ItemTemplate> 
      <tr> 
       <td><%#Eval("SentenceDate")%></td> 
       <td><%#Eval("TypeDesc")%></td> 
       <td><%#ZeroToNull(Eval("UnitTerm"))%> <%#ZeroToNullMoney(Eval("Amount"))%> <%#Eval("UnitTypeDesc")%></td> 
      </tr> 
     </ItemTemplate> 
    </asp:Repeater> 
</table> 

我試圖讓Sentences表爲每個Charge表的新實例重新填充,並帶有嵌套中繼器。然而,我嘗試了幾種不同的解決方案,但是每次Sentences表只是將相同的數據從第一次充電到所有這些數據。

我已經通過代碼幾次,我注意到,當它到DataBind第二個Sentences表,中繼器的ClientID不會改變,這使我認爲它不是滾動了一個新的實例中繼器,而不是每次重複相同的數據。

我的問題是:有沒有辦法讓它手動滾動一個新的順序ClientID,以便它每次綁定到正確的中繼器?或者我完全用錯誤的方式來解決這個問題?

+0

這是殺害數據庫服務器。如果您讓他們成爲網頁課程的成員,MyCase和費用可以檢索一次。在頁面加載事件中填充它們,然後在數據綁定事件中使用它們。儘管MyCase似乎並未被數據綁定使用。 –

回答

0

首先刪除不必要的來自MyCase的電話並在rptChg_ItemDataBound方法中收費。對於每個綁定的Charge項目,您不需要一遍又一遍地加載相同的項目。

您可以通過RepeaterItemEventArgs對象傳遞給你的處理方法訪問充電項目。

protected void rptChg_ItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 
     //check if it is a ItemTemplate. Sometimes could be a header template? 
     if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
     { 
     var charge = (Charge)e.Item.DataItem; 
     Repeater rptSen = (Repeater)(e.Item.FindControl("rptSen")); 

     var sentences = SentenceAdapter.GetByChargeObjectID(chg.ChargeObjectID); // notice I removed the namespace for clarity, use the using statements instead 

     rptSen.DataSource = sentences; 
     rptSen.DataBind(); 
     } 
    } 

什麼是從你的面前丟失,但你想從代碼實現的背後是SentenceDispositions的第二個中繼器。這可能會在句子中繼器的ItemTemplate中。遵循相同的模式,您可以處理rptSen轉發器的ItemDataBound事件。

protected void rptSen_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) 
    { 
     var sentence = (SentenceDisposition)e.Item.DataItem; 
     Repeater rptDisp = (Repeater)(e.Item.FindControl("rptDisp")); 

     var dispositions = SentenceDispositionAdapter.GetDispositionsBySentenceOID(sentence.SentenceID)); 

     rptDisp.DataSource = dispositions ; 
     rptDisp.DataBind(); 
    } 
} 

https://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.repeater.itemdatabound(v=vs.110).aspx

+0

好的,謝謝你的回答。儘管我有一個縈繞不定的問題,我從哪裏得到chg?在舊代碼中,它在Foreach塊中,我在哪裏指定它?因爲它說在這種情況下chg不存在。 – Taborator

+0

歡迎。 rptChg保持原樣。它在Page_Load中填充了數據。 –

+0

對不起,我還不夠清楚。 我的意思是 SentenceAdapter.GetByChargeObjectID(chg.ChargeObjectID); 它告訴我chg在這種情況下不存在。 – Taborator