<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数据就会拒绝继续绘制下一个元素。
答案 0 :(得分:1)
您需要确保堆栈跟踪。
但我可以看到几个问题:
示例解决方案
(System.Convert.ToInt32应将DBNull / NULL转换为0)
或者更改isCompleted以接受Object参数并在函数内部执行NULL / DBNull检查。
答案 1 :(得分: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()将在被调用的方法中工作。
答案 2 :(得分:0)
如果我不得不猜测,我会说你的 isCompleted 函数不处理 Nothing 的值。这是猜测,因为您的示例中未列出该函数。
答案 3 :(得分:0)
我更倾向于明确。 原谅代码中的任何小错误,我无法对此进行测试。
如果在你的标记中你用文字替换那些文字,那么在后面的代码中:
如果您有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更受控制的方式来满足空值等。