我有一个受保护的变量,用于转发器itemtemplate,<%#Bonus%>这是在转发器的OnItemDataBound事件中根据同一行中其他列的值计算的。
问题是行的Bonus值显示在下一行。因此对于第1行,该值为空。第二行显示第1行的奖金,第三行显示第二行的奖励值,依此类推。绑定值显示正常。它是显示在错误行中的计算值。
在OnItemDataBound事件中,似乎计算了计算值,但由于某种原因,该值不会用于呈现当前行,而是用于下一行。
我做错了什么?
更新
简化示例代码:
.......
protected Decimal Bonus;
.....
(then inside repeater OnItemDataBound handler)
.....
DataRowView row = (DataRowView) e.Item.DataItem;
Bonus = Convert.ToInt32(row["salary"]) * .01;
in ASPx:
.....
<asp:Repeater runat="server">
<ItemTemplate>
<td><%# Eval("salary") %> <== will show correct value
</td>
<td><#% Bonus %> <== doesn't show the bonus computed for that row from OnItemDataBound handler. Shows up in the next repeater row.
</td>
<ItemTemplate>
答案 0 :(得分:0)
OnItemDataBound
在绑定行后发生。
当前行的所有值都出现在函数的参数中。
如果您需要设置一个新值,因为在此函数之后转发器不会再次绑定值,您应该自己设置控件的文本。
void myRepeater_ItemDataBound(Object Sender, RepeaterItemEventArgs e) {
// This event is raised for the header, the footer, separators, and items.
// Execute the following logic for Items and Alternating Items.
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) {
if (((Evaluation)e.Item.DataItem).Rating == "Good") {
((Label)e.Item.FindControl("BonusLabel")).Text= Bonus.ToString();
}
}
}
答案 1 :(得分:0)
您可以绑定到执行计算的方法:
<强>代码隐藏强>
public string CalculateBonus(object salaryValue)
{
int salary;
string bonus;
if (Int32.TryParse(salaryValue.ToString(), out salary))
{
bonus = (salary * .01).ToString();
}
else
{
bonus = "N/A"; //or whatever default value you want to return
}
return bonus;
}
aspx页面
<td><%# CalculateBonus(Eval("Salary")) %></td>