分享
 
 
 

在Repeater控件中使用if语句

王朝asp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

.Afr_ARTICLE_TITLE

{

font: NORMAL BOLD 14px "Tahoma";

}

.Afr_CONTENTS

{

font: NORMAL NORMAL 12px "Tahoma";

line-height: 22px;

}

.Afr_CODE

{

font: NORMAL NORMAL 11px "Courier New";

line-height: 20px;

width: 100%;

background-color: #EEEEEE;

padding: 5 10 5 10;

}

.Afr_COMMON

{

color: #009900;

}

.Afr_STRING

{

color: #EE0000;

}

.Afr_SERVER_SIDE

{

background-color: #FFFFDD;

}

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有