我最近在写一个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