<li><span class="tm_right_x">Itinerary:</span>
<a href="<%#(((int)eval_r("TourID"))==0)?("/upload/Testimonial/"+eval_r("ToursPdfPath")):GetItineraryUrl(eval_r("TourID").ToString())%>" target="_blank" >
<%#eval_r("Itinerary") %></a>
</li>
Itinerary处需加入链接,根据TourID字段是否为空绑定不同的链接。使用了三目表达式。
以下是有关在repeater控件中使用if的博文,
源自http://www.sudu.cn/info/html/edu/20080415/277646.html
<asp:Repeater ID="_TopicRepeater" Runat="SERVER" DataSource="..."> <ItemTemplate> <%# DataBinder.eval_r(Container.DataItem, "Title") %> <%# DataBinder.eval_r(Container.DataItem, "Author") %> <%# DataBinder.eval_r(Container.DataItem, "Clicked") %> <%# DataBinder.eval_r(Container.DataItem, "ReCount") %> <> </ItemTemplate> </asp:Repeater>
使用if语句的目的是在于:判断当前帖子的回复次数为 0 时,就将 LastReplyer 这项显示成“----”。而当前的帖子的回复次数不为 0 时,则显示回复人的名字。但是,这样的做法是行不通的。在IE中会出现类似的警告
编译器错误信息: CS0246: 找不到类型或命名空间名称“Container”(是否缺少 using 指令或程序集引用?)
即便,根据这个错误提示,将所有可能用到的命名空间全都 Import 到这个文件里,也还是会提示其他错误信息的。至于为什么这样?可能是因为 DataBinder.Eval 和 Container.DataItem 同属 Repeater 类的成员的缘故。 “<%# %>”就是“作用”在 Repeater 上,但是 “if ... else ...” 语句则不同,它是“作用”在整个页面上。这就象是在全局过程中直接访问局部变量。当然,用类似下面(三目运算)的语句也可以实现上述功能:
<%# ((int)(DataBinder.eval_r(Container.DataItem, ))==0) ? : DataBinder.eval_r(Container.DataItem, ) %>
可问题是,对于复杂的判断处理,这样的做法就相当困难了。
而 <%# if ... else ... %> 这样的用法又为什么也不行呢?因为 <%# %> 相当于 <%= %>,而 <%= %> 就是 Response.Write(),那么前面的判断就显得可笑:
Response.Write( if ... else ... );
如果非要在 Repeater 中使用 if 语句来判断其中的数据,那么可以采用下面的方法:
<> <asp:Repeater ID="_TopicRepeater" Runat="SERVER" DataSource="..."> <ItemTemplate> <%# DataBinder.eval_r(Container.DataItem, "Title") %> <%# DataBinder.eval_r(Container.DataItem, "Author") %> <%# DataBinder.eval_r(Container.DataItem, "Clicked") %> <%# DataBinder.eval_r(Container.DataItem, "ReCount") %> ---- <%# DataBinder.eval_r(Container.DataItem, "LastReplyer") %> </ItemTemplate> </asp:Repeater>
其基本思路是,得到 _TopicRepeater 的数据源(DataSource)
(注明:我在绑定 Repeater 的数据源时,使用的是 DataSet.Tables["..."].DefaultView。如果使用的是其他的数据源,那么在给 Repeater.DataSource 强制转型时,要稍加注意)
并返回该表(Table)的当前行(Rows[_nIndex++])最后判断 ReCount 列是否为 0?在最初的时候 _nIndex 被赋值为 0,然后,在每一次的 ItemTemplate 里都自加一次。其目的,也就是让 _nIndex 记录当前正在访问的记录“行”。
对于DataGrid和DataList,这个方法也是可行的。
最后,这个方法在进行复杂判断绑定数据时确实有效,但是我并不推荐这样的做法!因为这样的做法并不符合面向对象的封装特性,或者说,它是以破坏了封装特性的做法使之透明,来完成判断功能的。 我推荐的做法是,使用“自定义用户控件”来完成复杂的判定绑定任务。