Repeater控件中加入判断_se7en3_新浪博客

<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.EvalContainer.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,这个方法也是可行的。

最后,这个方法在进行复杂判断绑定数据时确实有效,但是我并不推荐这样的做法!因为这样的做法并不符合面向对象的封装特性,或者说,它是以破坏了封装特性的做法使之透明,来完成判断功能的。 我推荐的做法是,使用“自定义用户控件”来完成复杂的判定绑定任务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值