我最近在寫一個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