在Repeater控件中使用if语句

系统 2298 0
原文: 在Repeater控件中使用if语句

我最近正在写一个 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.Eval Container.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.cn Afritxia@Hotmail.com

在Repeater控件中使用if语句


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论