1
<asp:Repeater ID="rptLessons" runat="server">
    <ItemTemplate>
        <tr>

            <td><%#Eval("fullname")%></td>
            <td><%#isCompleted(Eval("totallessons"), Eval("completedlessons"), Eval("totalNumAvail"), Eval("totalNumCorrect"))%></td>
            <td><%#FormatPercent(Eval("totalnumcorrect") / Eval("totalNumAvail"))%> <%-- (<%#Eval("totalnumcorrect")%> / <%#Eval("totalNumAvail")%>) --%></td>
            <td><%#FormatPercent(Eval("completedlessons") / Eval("totallessons"))%> <%-- (<%#Eval("completedlessons")%> / <%#Eval("totallessons")%>) --%></td>
            <td><%#Eval("lastaccessed")%></td>
        </tr>
    </ItemTemplate>
   </asp:Repeater>

我无法弄清楚,但一旦它遇到一些 NULL 数据,它就会拒绝继续绘制下一个元素。

4

4 回答 4

1

您需要提供堆栈跟踪以确定。

但我可以看到几个问题:

  1. FormatPercent 中的 DIV#0 错误
  2. 空错误。

示例解决方案

(System.Convert.ToInt32 应将 DBNull/NULL 转换为 0)

或更改 isCompleted 以接受 Object 参数并在函数内部进行 NULL / DBNull 检查。

于 2009-02-25T04:19:03.653 回答
1

稍微不同的方法可能会有所帮助,那就是在代码中进行计算,而不是在标记中内联。只是更容易检查空值等。除了标记中的简单 Eval() 之外,我几乎总是沿着这条路走。

<td>
    <%#GetCorrectPercent()%>
</td> 

protected string GetCorrectPercent()
{
    if(Eval("totalnumcorrect") == null || Eval("totalNumAvail") == null)
        return "n/a";

    return ((int)Eval("totalnumcorrect") / (int)Eval("totalNumAvail")).ToString();
}

不确定这里的所有格式都是正确的,但这应该会让你朝着不同的方向前进。只要调用者当前正在执行 DataBind(),Eval() 就会在被调用的方法中工作。

于 2009-02-25T04:20:16.457 回答
0

如果我不得不猜测,我会说您的isCompleted函数不处理Nothing的值。这是一个猜测,因为您的示例中没有列出该函数。

于 2009-02-25T03:24:14.080 回答
0

我更倾向于明确的。请原谅代码中的任何小错误,我无法对此进行测试。

如果在您的标记中将这些 eval 换成文字,那么在后面的代码中:

如果你有一个 MyClass 的集合。

在您页面的初始化事件中

this.rptLessons.OnItemDataBound += rptLessons_DataBound...

在负载中或您选择的任何地方

this.rptLessons.DataSource = CollectionOfMyClass;
this.rptLessons.DataBind();

然后在那个 itemDataBoundEvent

MyClass myClass = (MyClass)ri.DataItem;
Literal litFullname = FindControl(ri, "litFullName");
litFullName.Text = myClass.Fullname;

这样,您可以以比使用 eval 更可控的方式处理空值等问题。

于 2009-02-25T09:37:57.897 回答