blog.Toby

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  130 随笔 :: 2 文章 :: 150 评论 :: 0 Trackbacks
我最近在写一个BBS的项目,在显示主题列表时,我遇到了一个问题。  
   
  BBS_Topic的数据表结构定义类似下面这样:  
   
  TABLE   BBS_Topic  
  (  
  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中会出现类似的警告“没有引用Container,使用using引用...”  
   
  至于为什么这样?可能是因为DataBinder.Eval和Container.DataItem同属Repeater类的成员的缘故。  
   
  “<%#   %>”就是“作用”在Repeater上,但是if语句则不同,它是“作用”在整个页面上。  
   
  当然,用类似下面(三目运算)的语句也可以实现上述功能:  
   
  <%#   ((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   nCount=(int)(((DataView)_TopicRepeater.DataSource).Table.Rows[_nIndex++]["ReCount"]);  
   
  if(nCount==0)   {   %>  
  ----  
  <%   }   else   {   %>  
  <%#   DataBinder.Eval(Container.DataItem,   "LastReplyer")   %>  
  <%   }   %>  
  </ItemTemplate>  
  </asp:Repeater>  
   
  ######################################################################  
   
  其原理是,得到_TopicRepeater的数据源(DataSource),并返回该表(Table)的当前行(Rows[_nIndex++])  
   
  最后判断ReCount列是否为0?  
   
  在最初的时候_nIndex被赋值为0,然后,在每一次的ItemTemplate里都自加一次。  
   
  其目的,也就是让_nIndex记录当前正在访问的记录“行”。  
   
  完,希望能对您有所帮助...

http://topic.csdn.net/t/20041021/15/3478270.html

posted on 2008-09-24 13:08 渠上月 阅读(4045) 评论(2)  编辑  收藏 所属分类: other tips

评论

# re: 在Repeater控件中使用if语句(参考) 2012-11-15 09:23 游客
不对 <% int _nIndex=0; %>在Repeater里根本得不到  回复  更多评论
  

# re: 在Repeater控件中使用if语句(参考)[未登录] 2013-07-19 09:20 AA
@游客恩,此方法错误!  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: