原文:在Repeater控件中使用if语句

.Afr_ARTICLE_TITLE
{
font: NORMAL BOLD 14px "Tahoma";
}
.Afr_CONTENTS
{
font: NORMAL NORMAL 12px "Tahoma";
line-height: 22px;
}
.Afr_CODE
{
font: NORMAL NORMAL 11px "Courier New";
line-height: 20px;
width: 100%;
background-color: #EEEEEE;
padding: 5 10 5 10;
}
.Afr_COMMON
{
color: #009900;
}
.Afr_STRING
{
color: #EE0000;
}
.Afr_SERVER_SIDE
{
background-color: #FFFFDD;
}

我最近正在写一个 BBS 的项目,在显示主题列表时,我遇到了一个问题。 BBS_Topic 的数据表结构定义大致是下面这样:

TABLE BBS_Topic
(
    TopicID      INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
    Title        NVARCHAR(40),
    Author       NVARCHAR(20),
    PostDate     DATETIME NOT NULL DEFAULT GETDATE(),
    Content      NTEXT,
    Clicked      INT NOT NULL DEFAULT 0,
    ReCount      INT NOT NULL DEFAULT 0,
    LastReplyer  NVARCHAR(20)
)

下面是ListTopic.aspx文件中的部分内容:

<asp:Repeater ID="_TopicRepeater" Runat="SERVER" DataSource="...">
<ItemTemplate>
    <%# DataBinder.Eval(Container.DataItem, "Title") %>
    <%# DataBinder.Eval(Container.DataItem, "Author") %>
    <%# DataBinder.Eval(Container.DataItem, "Clicked") %>
    <%# DataBinder.Eval(Container.DataItem, "ReCount") %>
    <!-- 注意下面的if语句 -->
    <% if((int)(DataBinder.Eval(Container.DataItem, "ReCount"))==0){ %>
        ----
    <% } else { %>
       <%# DataBinder.Eval(Container.DataItem, "LastReplyer") %>
    <% } %>
</ItemTemplate>
</asp:Repeater>

使用if语句的目的是在于:判断当前帖子的回复次数为 0 时,就将 LastReplyer 这项显示成“----”。而当前的帖子的回复次数不为 0 时,则显示回复人的名字。但是,这样的做法是行不通的。在IE中会出现类似的警告
         编译器错误信息: CS0246: 找不到类型或命名空间名称“Container”(是否缺少 using 指令或程序集引用?)
即便,根据这个错误提示,将所有可能用到的命名空间全都 Import 到这个文件里,也还是会提示其他错误信息的。至于为什么这样?可能是因为 DataBinder.EvalContainer.DataItem 同属 Repeater 类的成员的缘故。 “<%# %>”就是“作用”在 Repeater 上,但是 “if ... else ...” 语句则不同,它是“作用”在整个页面上。这就象是在全局过程中直接访问局部变量。当然,用类似下面(三目运算)的语句也可以实现上述功能:

<%# ((int)(DataBinder.Eval(Container.DataItem, "ReCount"))==0)
    ? "----"
    : DataBinder.Eval(Container.DataItem, "LastReplyer") %>

可问题是,对于复杂的判断处理,这样的做法就相当困难了。
而 <%# if ... else ... %> 这样的用法又为什么也不行呢?因为 <%# %> 相当于 <%= %>,而 <%= %> 就是 Response.Write(),那么前面的判断就显得可笑:
         Response.Write( if ... else ... );
如果非要在 Repeater 中使用 if 语句来判断其中的数据,那么可以采用下面的方法:

<% int _nIndex=0; %> <!--定义一个临时的整型变量-->
<asp:Repeater ID="_TopicRepeater" Runat="SERVER" DataSource="...">
<ItemTemplate>
    <%# DataBinder.Eval(Container.DataItem, "Title") %>
    <%# DataBinder.Eval(Container.DataItem, "Author") %>
    <%# DataBinder.Eval(Container.DataItem, "Clicked") %>
    <%# DataBinder.Eval(Container.DataItem, "ReCount") %>
<%
int nReCount=(int)(((DataView)_TopicRepeater.DataSource).Table.Rows[_nIndex++]["ReCount"]);
// 也可以分成几句来写
// DataView DV=(DataView)_TopicRepeater.DataSource;
// DV.Table.Rows[_nIndex++]["ReCount"];
if(nReCount==0) { %>
     ----
<% } else { %>
    <%# DataBinder.Eval(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,这个方法也是可行的。

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

Afritxia2003@Yahoo.com.cnAfritxia@Hotmail.com

在Repeater控件中使用if语句的更多相关文章

  1. asp.net关于Repeater控件中的全选,批量操作

    今天在Repeater控件中碰到一个全选的操作,于是上网查了一下,找到一个觉得比较好,便记录下来, 界面代码简化之后(全选操作): <script type="text/javascr ...

  2. ASP.NET- 查找Repeater控件中嵌套的控件

    如何在Repeater的HeaderTemplate和FooterTemplate模板中寻找控件?在Repeater的ItemTemplate模板中的控件,我们可以用Items属性来遍历行并用Find ...

  3. 获取不到Repeater控件中的CheckBox选中状态

    写在前面的话:在做一个项目的时候,需要使用到Repeater控件,并且在Repeater控件内放置了CheckBox控件来标志需要删除的行,选中后,在后台取到的CheckBox的值总是为false.最 ...

  4. asp.net 在repeater控件中加按钮

    在repeater中加入方法有两种方法: 第一种:是对repeater控件的行添加OnItemCommand事件,添加方法也是有两种 1.在设计页面中,选中repeater控件右击==>属性== ...

  5. 获取Repeater控件中的每一项数据

    var items = rptList.Items;//获取Repeater控件的所有项 foreach (RepeaterItem item in items)//遍历每一项内容 {   var t ...

  6. Repeater控件中的三目运算

    <asp:Repeater ID="rptimg" runat="server">        <ItemTemplate>      ...

  7. Repeater控件中的LinkButton(转)

    LinkButton小用法: 1.在使用时可以通过CommandName和CommandArgument属性联合起来绑定并传值,如:CommandName="record"Comm ...

  8. Webform中Repeater控件--绑定嵌入C#代码四种方式

    网页里面嵌入C#代码用的是<% %>,嵌入php代码<?php ?> 绑定数据的四种方式: 1.直接绑定 <%#Eval("Code") %> ...

  9. WebForm(四)——Repeater控件(重要、好用)

    Repeater控件,可以用来一次显示一组数据项.比如,可以用它们显示一个数据表中的所有行.             Repeater控件完全由模板驱动,提供了最大的灵活性,可以任意设置它的输出格式. ...

随机推荐

  1. HDU 4454 - Stealing a Cake(三分)

    我比较快速的想到了三分,但是我是从0到2*pi区间进行三分,并且漏了一种点到边距离的情况,一直WA了好几次 后来画了下图才发现,0到2*pi区间内是有两个极值的,每个半圆存在一个极值 以下是代码 #i ...

  2. GitLal+sourceTree版本号管理

    GitLab+sourceTree版本号管理 假设把代码提交到github上,仅仅能是公开的,除非你花钱了,可是我不想花钱,所以我选择了gitLab作为gitserver,使用gitLab的详细过程例 ...

  3. 新版SDK自己主动加入PlaceholderFragment的思考

    自从Android SDK更新到22.6.3,发现新建Activity的时候,会自己主动生成一个Fragment.这个Fragment是activity的静态内部类.同一时候生成了一个xml叫frag ...

  4. 内存分析工具 MAT 的使用

    1 内存泄漏的排查方法 Dalvik Debug Monitor Server (DDMS) 是 ADT插件的一部分,当中有两项功能可用于内存检查 : ·    heap 查看堆的分配情况 ·     ...

  5. iScreenLocker 3.1.8 安卓锁屏通知--苹果一样的体验

    *软件介绍: 苹果锁屏通知(iScreenLocker)是一款android上ios风格的锁屏软件.它颠覆安智通知设计,将原来状态栏的通知搬到锁屏界面上来,能够在桌面轻松收发短信,微博,微信等消息.它 ...

  6. 怎样在屏幕上显示多个alv

    本文解说怎样在屏幕上显示多个alv. 实现这种需求关键是下面几点(举例:在屏幕上显示4个alv): 1.须要定义4个alv control 2.由于有4个alv control,于是就须要定义4个容器 ...

  7. 无状态会话bean(3)---远程业务接口(没有排版)

    迄今为止,我们仅仅讨论了使用一个本地业务接口的会话bean.在这样的情况下.本地意味着仅仅能由执行在同一个应用程序server实例的JavaEE组件声明会话bean的依赖性.比如.远程client不可 ...

  8. 上delloc 无呼叫 故障排除 笔记

    经验 delloc 无呼叫 基本上可以得出结论,即循环引用的原因. 遇到这样的情况基本上可分为 1: 属性声明weak的地方 写成了 strong  .比方delegate. 2: block语法块中 ...

  9. 从零開始学android&lt;数据存储(1)SharedPreferences属性文件.三十五.&gt;

    在android中有五种保存数据的方法.各自是: Shared Preferences Store private primitive data in key-value pairs. 相应属性的键值 ...

  10. ubuntu上搭建工作环境

    版本号ubuntu desktop, v12.4, v13.10. 长处: 1)绚丽易用的可视化环境: 2)丰富的可用package.在这点上比centos强太多.后者更新较慢: 不足: 1)在笔记本 ...