C#DataBind with Lists内部循环

时间:2017-08-23 16:53:24

标签: c# asp.net

我试图将List绑定到Repeater。这是我的代码:

 protected void Page_Load(object sender, EventArgs args)
        {
            CaseEnt MyCase = MyLib.IAdapters.CaseAdapter.GetCaseRecordForCaseNumber("14CF000810");
            List<Charge> charges = MyLib.IAdapters.ChargeAdapter.GetByCaseNumber("14CF000810");
            if (charges != null && charges.Count > 0)
            {
                foreach (Charge chg in charges)
                {
                    List <Sentence> sentences = MyLib.IAdapters.SentenceAdapter.GetByChargeObjectID(chg.ChargeObjectID);
                    rpt1.DataSource = sentences;
                    rpt1.DataBind();
                }
            }
        }

我已在代码中设置了止损,以检查哪些值流入列表。当正在填充句子列表时,它会显示值,但当我在将其指定为数据源时进行检查时,它是空白的。

我做错了什么?

我已经在这方面工作了一段时间,我已经在网上搜索了答案,似乎没有人能够帮助我。任何帮助都会受到赞赏,即使它解释了不同的做法。

2 个答案:

答案 0 :(得分:1)

foreach循环中为转发器分配数据源背后的Rational很难理解。

每次为转发器分配新的句子组作为数据源时,先前绑定的数据(即句子)将被删除,新的句子不会被追加。

在您的情况下,最后一次收费 - chg,没有任何句子,因此List <Sentence> sentences圈内foreach的值变为null 。这是我唯一可以想到它为什么会这样的情况。您可能希望在此行上设置断点以查看是否属于这种情况 -

rpt1.DataSource = sentences;

如果您希望将所有费用中的所有句子绑定到Repeater控件,您可能希望首先通过CaseNumber收集所有这些句子,然后在没有foreach循环的情况下绑定它一次。

<强>更新

您已经编写了2种方法 - 一种用于获取给定案例编号的费用列表,第二种是获取给定费用的句子列表。

相反,你可以做这两个中的任何一个 -

  • 只编写一种方法,可以获得给定案例编号的所有费用的所有句子。在List <Sentence>对象中获取此方法的结果,并直接将其与Repeater控件绑定。

  • 不要写任何新方法,但不是在foreach循环中绑定转发器,而是可以在List <Sentence>对象中为每个电荷添加句子。

像这样:

List <Sentence> sentences;
foreach (Charge chg in charges)
{
    List <Sentence> sentencesForThisCharge = MyLib.IAdapters.SentenceAdapter.GetByChargeObjectID(chg.ChargeObjectID);
    if (null != sentencesForThisCharge) 
    {
        sentences.Add(sentencesForThisCharge);
    }
}

rpt1.DataSource = sentences;
rpt1.DataBind();

我希望这会有所帮助。

答案 1 :(得分:0)

您正在重置绑定到转发器,有效地覆盖已经绑定到它的内容。

如果你在循环之外删除你的句子列表和数据绑定命令,它将起作用。

if (charges != null && charges.Count > 0)
        {
            List<Sentence> sentences = new List<Sentence>();
            foreach (Charge chg in charges)
            {
                sentences.AddRange(MyLib.IAdapters.SentenceAdapter.GetByChargeObjectID(chg.ChargeObjectID))

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