每个转发器行的计算变量显示在下一行中

时间:2013-04-16 04:18:08

标签: asp.net .net data-binding repeater

我有一个受保护的变量,用于转发器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>

2 个答案:

答案 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>