0

我有一个受保护的变量并在转发器项目模板中使用,<%# Bonus %> 根据同一行中其他列的值在转发器的 OnItemDataBound 事件中计算。

问题是一行的奖金值显示在下一行。所以对于第 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>
4

2 回答 2

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();
         }
      }
   }   
于 2013-04-16T04:40:13.733 回答
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;
}

页面

<td><%# CalculateBonus(Eval("Salary")) %></td>
于 2013-04-16T14:42:59.850 回答