我对ASP还比较陌生,这个问题让我有点困惑。我有一个重复器(
我还有一些代码,意图是在页面上设置文本以替换
据我所知,重复器正在进行数据绑定(因为
编辑:已解决,请参见更新后的代码。
ASP(删除了不相关的内容)
basicInfoReport
)与数据源(basicInfo
)相连。这部分工作正常;重复器中的Eval
调用返回了正确的数据。我还有一些代码,意图是在页面上设置文本以替换
<asp:Literal>
。下面分别放了两个片段。据我所知,重复器正在进行数据绑定(因为
Eval
调用起作用),所以我无法弄清楚为什么它报告零项,因此foreach
语句什么也没做。有人能帮忙吗? :)编辑:已解决,请参见更新后的代码。
ASP(删除了不相关的内容)
<asp:AccessDataSource ID="basicInfo" runat="server"
DataFile="~/Disasters.accdb"
SelectCommand="SELECT * FROM [DisasterTable] WHERE ([ID] = ?)">
<SelectParameters>
<asp:QueryStringParameter Name="ID" QueryStringField="ID" Type="Int32" />
</SelectParameters>
</asp:AccessDataSource>
<asp:Repeater ID="basicInfoReport" runat="server" DataSourceID="basicInfo"
onitemdatabound="basicInfoReport_ItemDataBound">
<ItemTemplate>
<h2>Disaster report: <%#Eval("Description")#%></h2>
<b><i>This report is confidential.</i></b><br /><br /><br />
This event was reported on <tt><%#Eval("dateReported")#%></tt>. It was reported <asp:Literal ID="_wasReportedAnonymously" runat="server"></asp:Literal> and is currently <asp:Literal ID="_isEmergency" runat="server"></asp:Literal> classed as an emergency.
</ItemTemplate>
</asp:Repeater>
C# (irrelevant stuff removed)
protected void basicInfoReport_ItemDataBound(object sender, RepeaterItemEventArgs e) {
// [...]
// reader refers to an OleDbDataReader that is used for some database interaction in this method.
// until this point, basicInfoReport has not been referenced at all.
if (reader[1].ToString().Equals("False"))
{
// at this point basicInfoReport.Items.Count is always zero
foreach (RepeaterItem repeaterItem in basicInfoReport.Items) {
// control never makes it this far
if (repeaterItem.ItemType == ListItemType.Item || repeaterItem.ItemType == ListItemType.AlternatingItem)
{
Literal emergencyLiteral = (Literal)repeaterItem.FindControl("_isEmergency");
emergencyLiteral.Text = "not";
}
}
}
// [...]
}
更新: 在almog.ori的帮助下解决了问题。供我参考,这是可用的代码:
C#(删除了不相关的内容)
protected void basicInfoReport_ItemDataBound(object sender, RepeaterItemEventArgs e) {
// [...]
// reader refers to an OleDbDataReader that is used for some database interaction in this method.
// until this point, basicInfoReport has not been referenced at all.
if (reader[1].ToString().Equals("False"))
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
Literal emergencyLiteral = (Literal)e.Item.FindControl("_isEmergency");
emergencyLiteral.Text = "not";
}
}
// [...]
}