我试图将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();
}
}
}
我已在代码中设置了止损,以检查哪些值流入列表。当正在填充句子列表时,它会显示值,但当我在将其指定为数据源时进行检查时,它是空白的。
我做错了什么?
我已经在这方面工作了一段时间,我已经在网上搜索了答案,似乎没有人能够帮助我。任何帮助都会受到赞赏,即使它解释了不同的做法。
答案 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();
}