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