repeater标签双重循环的使用
在网站开发中,.NET中的repeater标签几乎是笔者首选,也是唯一一个不会生成多余元素的标签,所有样式都是自定义的,这点类似 struts中的<s:iterator/>标签。
在日常编码中,有时候希望使用两层repeater嵌套进行绑定数据。
比如笔者希望创建一个如图所示的折叠菜单:

1.编写HTML代码
<!--loop1 start-->
<asp:Repeater ID="rptFirst" runat="server">
<ItemTemplate>
<div class="lsbox">
<div class="lsbar">
<span class="icon1">
第<%#Container.ItemIndex%>次登记
</span>
</div>
<ul class="lslis">
<!--loop2 start-->
<asp:Repeater ID="rptSecond" runat="server">
<ItemTemplate>
<li><a href='#'><%#Eval("YName") %></a></li>
</ItemTemplate>
</asp:Repeater>
<!--loop2 end-->
</ul>
</div>
</ItemTemplate>
</asp:Repeater>
<!--loop1 end-->
代码经过笔者简化,如上面所示。rptFirst绑定父节点菜单,rptSecond绑定子节点菜单。
//绑定父菜单数据
rptFirst.DataSource = list;
rptFirst.DataBind();
//循环父菜单个数
for (int i = ; i < list.Count; i++)
{
参数 = list[i];
//查找内层repeater标签
Repeater rptSecond= this.rptFirst.Controls[i].FindControl("rptSecond") as Repeater;
//根据外层标签参数获取子标签集合
IList<Floor> flist = 子循环集合[参数来源外层标签];
//绑定子菜单数据
rptSecond.DataSource = flist;
rptSecond.DataBind();
}
这样,数据就成功绑定了。(注意:如果当前页面使用了母板页,内层循环无法绑定到数据。)
2.双重循环中的索引
A.在第一层循环中获取外层索引:<%#Container.ItemIndex%>
B.在第二层循环中获取外层索引:此时使用<%#Container.ItemIndex%>获取的是内层的索引,所以我们使用javascript变量作为临时存储,此时声明的i是局部变量,可以在循环中使用:
<script>
var i = <%#Container.ItemIndex %>;
</script>
在内层循环中需要使用的地方输出变量:<script>document.write("<ul class='databody bg"+i+"'>");</script>
3.如果想在repeater中倒叙索引值,可以这样(这种情况很少见)
<script type="text/javascript">
var i=<%#Container.ItemIndex %>;//获取当前索引
var total = <%=rptFirst.Items.Count %>;//获取总循环数(使用表达式)
document.write(total-i);//输出
</script>
默认获取的索引是从0开始递增,如果希望获取递减的索引值,如上所示使用javascript。
===================================================================
4.在使用了母板的内容页中双层嵌套时。
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<div id="leftslide">
<div class="bk40"></div>
<div class="bk10"></div>
<div class="icon-house"><%=groupName %></div>
<!--loop1 start-->
<asp:Repeater ID="rptXkz" runat="server">
<ItemTemplate>
<div class="lsbox">
<div class="lsbar">
<span class="icon1">第
<script type="text/javascript">
var i=<%#Container.ItemIndex %>;
var total = <%=rptXkz.Items.Count %>
document.write(total-i);
</script>
次备案(<%#Eval("Y_YouXiaoQi") %>)</span></div>
<ul class="lslis">
<!--loop2 start-->
<asp:Repeater ID="rptFloor" runat="server">
<ItemTemplate>
<li yno="<%#Eval("YNO") %>"><a href='fangjiaNew.aspx?yid=<%#Eval("XF_YSXKZId") %>&yno=<%#Eval("YNO") %>'><%#Eval("YName") %></a>
<asp:Label ID="lblTao" runat="server" Text=""></asp:Label></li>
</ItemTemplate>
</asp:Repeater>
<!--loop2 end-->
</ul>
</div>
</ItemTemplate>
</asp:Repeater>
<!--loop1 end-->
</div>
仍然可以找到rptFloor控件
//左边树菜单
private void LoadTreeInfo()
{
IList<XF_YSXKZ> list = XF_YSXKZService.QueryByXiangMuGroup(groupName);
rptXkz.DataSource = list;
rptXkz.DataBind();
for (int i = ; i < list.Count; i++)
{
XF_YSXKZ xkz = list[i];
int xkzID = xkz.YID;
Repeater rptFloor = this.rptXkz.Controls[i].FindControl("rptFloor") as Repeater;
IList<XF_Floor> flist = XF_FloorService.QueryFloorByXkzID(xkzID);
rptFloor.DataSource = flist;
rptFloor.DataBind();
for (int j = ; j < flist.Count; j++)
{
Label lbl = rptFloor.Controls[j].FindControl("lblTao") as Label;
XF_Floor xf = flist[j];
int total = XF_FangService.QueryCountByGroupNameAndYNO(groupName, xf.YNO);
int leave = XF_FangService.QueryCountByGroupNameAndYNOAndXState(groupName, xf.YNO, " #006600");
lbl.Text = "剩" + leave + "套/共" + total + "套";
}
}
}
但是如果母板页使用了字段绑定 在pageload中调用了这个方法:this.DataBind();
那无论内容页如何绑定rptFloor都无法得到值。
如:母板页使用了全局变量 public NewFloor Floor{}
然后在页面上这样绑定 <%#Floor.NF_Name %> 注意这里使用的#符号 所以需要调用this.DataBind()绑定数据。
也就是说:(母板页中的this.DataBind()方法会导致 内容页中双层嵌套的内层repeater绑定数据无效)
我们将上面的 # 改成 = 如:<%=Floor.NF_Name %> 然后删除this.DataBind(); 这样内容页中的rptFloor控件就可以正常得到数据了。
此问题困扰我3-4个小时,最后通过删除母板逐句排除才找到原因,希望对大家有用。
repeater标签双重循环的使用的更多相关文章
- java08双重循环打印图形
// 九九乘法表 外层循环每执行一次,内层循环执行一遍 for (int i = 1; i <= 9; i++) { // 外层控制的是行数 for (int j = 1; j <= i; ...
- 带标签的循环语句、switch
今天继续更新,控制流程的剩余部分内容,带标签的循环语句中的continue/break 的使用方法,以及switch关键字的使用方法.例1:带标签的continue/break.package com ...
- java基础08 双重循环打印图形
public class Double01 { /** * 若有3个班级各4名学员参赛, * 如何计算每个班级参赛学员的平均分? */ public static void main(String[] ...
- Python基础—05-总结:双重循环,数据类型
总结 双重循环 冒泡排序 lt = [1, 5, 7, 3, 2, 4] # 计算元素的个数 n = len(lt) # 外层循环控制圈数 for i in range(n-1): for j in ...
- YTU 2690: 用双重循环实现小九九
2690: 用双重循环实现小九九 时间限制: 1 Sec 内存限制: 128 MB 提交: 848 解决: 573 题目描述 小九九是我们小时候常背的的乘法算术法则,现在用双重循环来实现小九九 1 ...
- vue标签内循环数据逗号分隔
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 输出简单图形(StringBuilder代替双重循环)
在有些题目中打印简单图形必须使用StringBuilder或者StringBuffer,否则会运行超时(用String都会超时). 因为在题目的要求中说到输入的n是小于1000的,用双重循环就会超时, ...
- doT模板双重循环模板渲染方法
doT模板作为一个前端渲染模板,有着非常显著的有点.1.轻量.2.快捷.3.无依赖. 本文介绍一种几乎所有模板都会遇到的问题,双重循环渲染.我们知道在dot模板中循环渲染用的是{{~ it:value ...
- shell脚本———双重循环——九九乘法表
1.基础双重循环模板 2.break跳出单个循环 3.continue中止某次循环中的命令,但不会完全中止整个命令 4.九九乘法表
随机推荐
- C++ 局部变量的析构
http://blog.chinaunix.net/uid-52437-id-2108747.html 在一个函数内,申明一个局部类变量.则这个变量什么时候析构呢? 并不是在函数退出,释放栈空间时候析 ...
- PHP每日签到时怎么实现
以淘宝网领取淘金币的签到系统为例:目标:第一天签到增加5个积分:第二天连续签到则增加8个积分:第三天连续签到,增加11个积分,第 四天连续签到,增加15个积分:第五天连续签到,增加19个积分:第六天连 ...
- 设置Linux下Mysql表名不区分大小写
1.Linux下mysql安装完后是默认:区分表名的大小写,不区分列名的大小写:2.用root帐号登录后,在/etc/my.cnf中的[mysqld]后添加添加lower_case_table_nam ...
- Java多线程之银行出纳员仿真
package concurrent; import java.util.LinkedList; import java.util.PriorityQueue; import java.util.Qu ...
- GCD信号量并发控制
/** * 当我们在处理一系列线程的时候,当数量达到一定量,在以前我们可能会选择使用NSOperationQueue来处理并发控制,但如何在GCD中快速的控制并发呢?答案就是dispatch_sem ...
- mysql 错误1054
问题,当查询数据时,输入字符串是数字时,可以查询,但当输入字母字符串时却不能查询,总是提示错误1054 解决:将字符串打上单引号 字段对应的值如果为字符或字符串类型的时候,应用英文单引号括起来,你用的 ...
- [Java] 过滤流BufferedInputStream和BufferedOutputStream
package test.stream; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import ...
- mysql设置定时任务
–查看时间调度器是否开启 SHOW VARIABLES LIKE 'event_scheduler'; SELECT @@event_scheduler; –开启时间调度器 SET GLOBAL ev ...
- 为textarea增加maxlength属性(转)
如果只是單純地想限制 textarea 中的字數,不想寫太多的話,可用: <textarea onkeyup="this.value = this.value.slice(0, 8 ...
- [VB.NET]拖动操作的技术基础
1.设置需要接受拖动事件的控件的AllowDrop属性为True,在开发界面时配置,不可通过代码配置 2.在DragEnter事件处理程序里,为e.Effet设置枚举值,否则拖动无效 Private ...