我在.NET 4上使用ASP.NET和C#来开发一个简单的应用程序。我有一个带有项目模板的转发器,其中包含一些控件;其中一个是必须根据复杂计算设置的标签。我正在使用OnItemDataBound
事件来计算文本并在后面的代码中设置标签的文本,如下所示:
protected void repRunResults_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
//capture current context.
Repeater repRunResults = (Repeater)sender;
Label laMessage = (Label)repRunResults.Controls[0].FindControl("laMessage");
DSScatterData.RunResultsRow rRunResults = (DSScatterData.RunResultsRow)((DataRowView)(e.Item.DataItem)).Row;
//show message if needed.
int iTotal = this.GetTotal(m_eStatus, rRunResults.MaxIterations, rRunResults.TargetLimit);
if(iTotal == 100)
{
laMessage.Text = "The computed total is 100.";
}
else
{
laMessage.Text = "The computed total is NOT 100.";
}
}
我的转发器的数据源包含几行,所以我希望转发器的每次展示都会调用事件处理程序并根据关联行中的数据显示消息。但是,我只收到一条消息,该消息显示在第一个转发器展示中,但与数据源中 last 行的数据相匹配。< / p>
似乎每次ItemDataBound
事件触发时,我的代码捕获的控件都是相同的,因此我会在转发器的每个印象上覆盖该消息。我已经完成了代码,这就是它显然正在发生的事情。
知道为什么吗?以及如何解决它?
请注意。我的中继器嵌套在另一个中继器内。我不认为这应该是相关的,但可能是。
答案 0 :(得分:2)
你抓住了第一个。您需要使用传入的项目,如下所示:
protected void repRunResults_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
//capture current context.
Repeater repRunResults = (Repeater)sender;
Label laMessage = e.Item.FindControl("laMessage"); //<-- Used e.Item here
DSScatterData.RunResultsRow rRunResults = (DSScatterData.RunResultsRow)((DataRowView)(e.Item.DataItem)).Row;
//show message if needed.
int iTotal = this.GetTotal(m_eStatus, rRunResults.MaxIterations, rRunResults.TargetLimit);
if(iTotal == 100)
{
laMessage.Text = "The computed total is 100.";
}
else
{
laMessage.Text = "The computed total is NOT 100.";
}
}