这很奇怪。我将通过以下示例尝试解释我的痛苦:
我在会话中有一个对象: Session [“reportQuestionGroupingTracker”] 。它包含一个字符串列表。如果找不到字符串,则会通过字符串文字在转发器中写入新的h3标头。
问题似乎是这一行: Session [“reportQuestionGroupingTracker”] = ary; 这条线似乎以某种方式(黑色)神奇地删除了 lit.Text 。当我断开代码并且它似乎一直存在,直到它超出了函数的范围(因此该部分就像预期的那样工作)时,该值就存在了 - 但字符串值似乎永远不会使它成为ASP.NET页面上的Literal控件 - 他们总是空白。
请注意,如果我注释掉问题行或此行: if(!ary.Contains(headingText)),标题会显示(但过多,因为每次迭代都会触发标题写)。
protected void rptQuestionsGroupedByCountry_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
RepeaterItem item = e.Item;
ArrayList ary = new ArrayList();
if (null != Session["reportQuestionGroupingTracker"]) ary = (ArrayList)Session["reportQuestionGroupingTracker"];
if ((item.ItemType == ListItemType.Item) ||
(item.ItemType == ListItemType.AlternatingItem))
{
DataRowView dr = (DataRowView)e.Item.DataItem;
string headingText = dr["Heading"].ToString();
Literal lit = (Literal)e.Item.FindControl("LiteralHeader");
if (!ary.Contains(headingText))
{
lit.Text = String.Format(@"<h3 class=""questionGroupingHeader"">{0}</h3>", headingText);
lit.Visible = true;
ary.Add(headingText);
Session["reportQuestionGroupingTracker"] = ary;
}
}
}
我已经在这里待了好几个小时,敲打着我的脑袋 - 我之前已经做了好几百次类似的事情了,我只是无法弄清楚为什么这次不起作用!我已经尝试将Repeater更改为DataList,尝试使用Context.Items对象而不是Session,List而不是ArrayList,但我受阻了。救命啊!
我也尝试在IIS 6中运行它,以防它是一些卡西尼怪异,但输出是相同的。这是一个ASP.NET 4.0项目。
这是aspx页面的代码:
<asp:Repeater ID="rptQuestionsGroupedByCountry" runat="server" OnItemDataBound="rptQuestionsGroupedByCountry_OnItemDataBound">
<HeaderTemplate><table></HeaderTemplate>
<ItemTemplate>
<tr><td>
<asp:Literal ID="LiteralHeader" runat="server" Visible="false" />
<h3 class="report-country-tag"><%#DataBinder.Eval(Container, "DataItem.Numbers")%>.<%#DataBinder.Eval(Container, "DataItem.QusetionName")%></h3>
<div class="report-content">
<%#DataBinder.Eval(Container, "DataItem.Answer")%>
<p class="date">Date Updated: <%#DataBinder.Eval(Container, "DataItem.DocumentModifiedWhen")%></p>
</div>
</td></tr>
</ItemTemplate>
<FooterTemplate></table></FooterTemplate>
答案 0 :(得分:2)
你的行问题
if (!ary.Contains(headingText))
每次加载页面时都必须填充文字文本
if (!ary.Contains(headingText))
{
ary.Add(headingText);
Session["reportQuestionGroupingTracker"] = ary;
}
lit.Text = String.Format(@"<h3 class=""questionGroupingHeader"">{0}</h3>", headingText);
lit.Visible = true;
答案 1 :(得分:0)
正如Micheal所怀疑的那样,对于每个页面加载,数据绑定例程被击中两次。第一次通过会话设置正确,但第二次,Headers被跳过,因为 if(!ary.Contains(headingText))正确告诉它。我没注意到两个数据绑定命中。我觉得很愚蠢。疲惫的编码不是这个明显问题的借口。抱歉浪费你的时间!
此外,我正在使用太大的数据集 - 我将遍历前5个循环并看到值已设置,然后只是F5。直到今天早上我清醒过来并且只是在每个函数中放置断点,这样我才能看到执行顺序并理解它到底发生了什么。然后这是一个令人头疼的时刻......很快就会有一个线路改变以解决问题......然后是一种兴高采烈的感觉。编程没有乐趣吗?
干杯并感谢您的帮助!
PS - 向Kochobay喊出这条线:'......每次加载页面......',这引起了头部的顿悟!