2009-02-25 51 views
0
<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数据,它拒绝继续绘制下一个元素。为什么我的转发器在Eval(NULL)值上保持崩溃?

+0

你说它崩溃,但确切的错误是什么? – 2009-02-25 04:54:32

+0

我无法看到任何错误,它只是没有完成填充其余的数据 – BigOmega 2009-02-25 18:58:52

回答

1

您需要给出一个堆栈跟踪来确保。

但我可以看到几个问题:

  1. DIV#0误差内FormatPercent
  2. NULL错误。

解决方案示例

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

或改变isCompleted接受对象paramters,做你的NULL/DBNull的函数内部检查。

0

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

+0

<%@ Page Language =“VB”... – BigOmega 2009-02-25 03:28:23

+0

我注释掉了这行,它仍然崩溃... – BigOmega 2009-02-25 04:30:40

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()将在被调用方法内工作。

0

我更倾向于明确。 原谅代码中的任何小错误,我无法测试这个。

如果你的标记,你换出那些evals的文字,然后在后面的代码:

如果你有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更受控制的方式。