C#/ASP.NET嵌套中继器确实会与新父母更改列表



这是我的C#后端:

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> 

我试图用嵌套的中继器来获取句子表以重新填充电荷表的每个新实例。但是,我尝试了几种不同的解决方案,但是每次句子表都将相同的数据从第一个费用吐出到所有方面。

我已经介入了代码几次,我注意到当它转到Databind的第二个句子表时,Repeater的客户端不会更改,这使我认为它并没有滚动到该句子的新实例上每次中继器,而是每次都重复相同数据。

我的问题是:有没有办法手动滚动一个新的顺序客户端,以便每次都可以绑定到正确的中继器?还是我完全以错误的方式进行操作?

首先在rptChg_ItemDataBound方法中删除从mycase和电荷的不必要的呼叫。您无需为每个绑定的Charge项目一遍又一遍地加载。

您可以通过 receaterIteMeventArgs 对象访问收费在处理程序方法中传递给您的对象。

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

前面缺少的内容,但是您想从后面的代码中实现的是 sendendispositions 的第二个中继器。这可能会在句子>句子 repeater的 itemTemplate 中进行。按照相同的模式,您可以处理 itemDatabound rptsen的事件 repeater。

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.repeaters.repeater.itemdatabound(v = vs.110).aspx

最新更新