在Repeater控件中使用if语句

原创 2004年11月04日 11:02:00
 
作者:Afritxia  

我最近正在写一个 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((int)(DataBinder.Eval(Container.DataItem, ))==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, ))==0)
    ? 
    : DataBinder.Eval(Container.DataItem, ) %>

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

 <>
<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") %>

     ----

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

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

在Repeater控件中使用if语句

.Afr_ARTICLE_TITLE{font: NORMAL BOLD 14px "Tahoma";}.Afr_CONTENTS{font: NORMAL NORMAL 12px "Tahoma";...
  • Afritxia
  • Afritxia
  • 2004年10月22日 12:06
  • 3046

在Repeater控件中使用if语句(参考)

来自:http://blog.csdn.net/Afritxia/article/details/146936 我最近正在写一个 BBS 的项目,在显示主题列表时,我遇到了一个问题。 BBS_Top...
  • ArvinStudy
  • ArvinStudy
  • 2012年08月20日 17:59
  • 2069

在Repeater控件中使用if语句(转自AfritXia)

我最近正在写一个 BBS 的项目,在显示主题列表时,我遇到了一个问题。 BBS_Topic 的数据表结构定义大致是下面这样: TABLE BBS_Topic(    TopicID      INT ...
  • soarheaven
  • soarheaven
  • 2006年05月22日 16:21
  • 834

在Repeater控件中使用if语句(转载自Afritxia的Blog)

我最近正在写一个 BBS 的项目,在显示主题列表时,我遇到了一个问题。 BBS_Topic 的数据表结构定义大致是下面这样: TABLE BBS_Topic(    TopicID      INT ...
  • croppy
  • croppy
  • 2005年03月30日 17:35
  • 625

【ASP.net】解析Repeater 控件的模板

Repeater控件不具备内置的呈现功能,用户必须通过创建模板来为它提供布局. 重复的东西就说明有很多相同的,那就可以抽出来。抽出来的东西,面向对象中叫类,设计模式中可以是模板方法。在Repe...
  • u010542940
  • u010542940
  • 2014年12月04日 11:10
  • 1660

mysql中 if语句的使用

Mysql的if既可以作为表达式用,也可在存储过程中作为流程控制语句使用,如下是做为表达式使用: IF(expr1,expr2,expr3) IF表达式  代码如下: 如果 e...
  • qq_22642239
  • qq_22642239
  • 2016年10月18日 10:57
  • 3051

Repeater当中绑定时间

Repeater中绑定时间使格式为 2013-11-1的样式 UTime")).ToString("yyyy-MM-dd")%> Utime 为时间字段...
  • linlin2294592017
  • linlin2294592017
  • 2013年11月05日 10:34
  • 981

C#Repeater控件

Repeater?一个只会绑定数据并显示数据的低级控件?哦~谁告诉你的?           Repeater因为他的灵活性和扩展性很高,备受很多程序员青睐。我的一个.net群成员曾因为比较Re...
  • zhandeen
  • zhandeen
  • 2012年09月25日 19:59
  • 2261

sql语句里的if用法实例

//数据库test中的表student。字段name,class,score,分别代表姓名,班级,分数。 //1.算出每个班级中的学生,按照成绩降序排序 /* select name,classa,s...
  • u014796999
  • u014796999
  • 2016年05月26日 10:30
  • 1072

面试算法--if语句中使用赋值语句

今天在讲课之余偶然发现java一个小问题,如下代码所示public class Test { public static void main(String[] args) { ...
  • zxm317122667
  • zxm317122667
  • 2016年09月17日 17:47
  • 1456
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在Repeater控件中使用if语句
举报原因:
原因补充:

(最多只允许输入30个字)