在网站开发中,.NET中的repeater标签几乎是笔者首选,也是唯一一个不会生成多余元素的标签,所有样式都是自定义的,这点类似 struts中的<s:iterator/>标签。

在日常编码中,有时候希望使用两层repeater嵌套进行绑定数据。

比如笔者希望创建一个如图所示的折叠菜单:

1.编写HTML代码

  1. <!--loop1 start-->
  2. <asp:Repeater ID="rptFirst" runat="server">
  3. <ItemTemplate>
  4.   <div class="lsbox">
  5.   <div class="lsbar">
  6.     <span class="icon1">
        第<%#Container.ItemIndex%>次登记
        </span>
      </div>
  7.   <ul class="lslis">
  8.     <!--loop2 start-->
  9.     <asp:Repeater ID="rptSecond" runat="server">
  10.     <ItemTemplate>
  11.       <li><a href='#'><%#Eval("YName") %></a></li>
  12.     </ItemTemplate>
  13.     </asp:Repeater>
  14.     <!--loop2 end-->
  15.   </ul>
  16.   </div>
  17. </ItemTemplate>
  18. </asp:Repeater>
  19. <!--loop1 end-->

代码经过笔者简化,如上面所示。rptFirst绑定父节点菜单,rptSecond绑定子节点菜单。

  1. //绑定父菜单数据
    rptFirst.DataSource = list;
  2. rptFirst.DataBind();
    //循环父菜单个数
  3. for (int i = ; i < list.Count; i++)
  4. {
  5.   参数 = list[i];
    //查找内层repeater标签
  6.   Repeater rptSecond= this.rptFirst.Controls[i].FindControl("rptSecond") as Repeater;
    //根据外层标签参数获取子标签集合
  7.   IList<Floor> flist = 子循环集合[参数来源外层标签];
    //绑定子菜单数据
  8.   rptSecond.DataSource = flist;
  9.   rptSecond.DataBind();
  10. }

这样,数据就成功绑定了。(注意:如果当前页面使用了母板页,内层循环无法绑定到数据。)

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中倒叙索引值,可以这样(这种情况很少见)

  1. <script type="text/javascript">
  2. var i=<%#Container.ItemIndex %>;//获取当前索引
  3. var total = <%=rptFirst.Items.Count %>;//获取总循环数(使用表达式)
  4. document.write(total-i);//输出
  5. </script>

默认获取的索引是从0开始递增,如果希望获取递减的索引值,如上所示使用javascript。  

===================================================================

4.在使用了母板的内容页中双层嵌套时。

  1. <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
  2. <div id="leftslide">
  3. <div class="bk40"></div>
  4. <div class="bk10"></div>
  5. <div class="icon-house"><%=groupName %></div>
  6. <!--loop1 start-->
  7. <asp:Repeater ID="rptXkz" runat="server">
  8. <ItemTemplate>
  9. <div class="lsbox">
  10. <div class="lsbar">
  11. <span class="icon1">
  12. <script type="text/javascript">
  13. var i=<%#Container.ItemIndex %>;
  14. var total = <%=rptXkz.Items.Count %>
  15. document.write(total-i);
  16. </script>
  17. 次备案(<%#Eval("Y_YouXiaoQi") %>)</span></div>
  18. <ul class="lslis">
  19. <!--loop2 start-->
  20. <asp:Repeater ID="rptFloor" runat="server">
  21. <ItemTemplate>
  22. <li yno="<%#Eval("YNO") %>"><a href='fangjiaNew.aspx?yid=<%#Eval("XF_YSXKZId") %>&yno=<%#Eval("YNO") %>'><%#Eval("YName") %></a>
  23. <asp:Label ID="lblTao" runat="server" Text=""></asp:Label></li>
  24. </ItemTemplate>
  25. </asp:Repeater>
  26. <!--loop2 end-->
  27. </ul>
  28. </div>
  29. </ItemTemplate>
  30. </asp:Repeater>
  31. <!--loop1 end-->
  32. </div>

仍然可以找到rptFloor控件

  1. //左边树菜单
  2. private void LoadTreeInfo()
  3. {
  4. IList<XF_YSXKZ> list = XF_YSXKZService.QueryByXiangMuGroup(groupName);
  5. rptXkz.DataSource = list;
  6. rptXkz.DataBind();
  7. for (int i = ; i < list.Count; i++)
  8. {
  9. XF_YSXKZ xkz = list[i];
  10. int xkzID = xkz.YID;
  11. Repeater rptFloor = this.rptXkz.Controls[i].FindControl("rptFloor") as Repeater;
  12. IList<XF_Floor> flist = XF_FloorService.QueryFloorByXkzID(xkzID);
  13. rptFloor.DataSource = flist;
  14. rptFloor.DataBind();
  15. for (int j = ; j < flist.Count; j++)
  16. {
  17. Label lbl = rptFloor.Controls[j].FindControl("lblTao") as Label;
  18. XF_Floor xf = flist[j];
  19. int total = XF_FangService.QueryCountByGroupNameAndYNO(groupName, xf.YNO);
  20. int leave = XF_FangService.QueryCountByGroupNameAndYNOAndXState(groupName, xf.YNO, " #006600");
  21. lbl.Text = "剩" + leave + "套/共" + total + "套";
  22. }
  23. }
  24. }

但是如果母板页使用了字段绑定 在pageload中调用了这个方法:this.DataBind();

那无论内容页如何绑定rptFloor都无法得到值。

如:母板页使用了全局变量 public NewFloor Floor{}

然后在页面上这样绑定 <%#Floor.NF_Name %>  注意这里使用的#符号 所以需要调用this.DataBind()绑定数据。

也就是说:(母板页中的this.DataBind()方法会导致 内容页中双层嵌套的内层repeater绑定数据无效

我们将上面的 # 改成 =  如:<%=Floor.NF_Name %>  然后删除this.DataBind();  这样内容页中的rptFloor控件就可以正常得到数据了。

此问题困扰我3-4个小时,最后通过删除母板逐句排除才找到原因,希望对大家有用。

荆州古城

repeater标签双重循环的使用的更多相关文章

  1. java08双重循环打印图形

    // 九九乘法表 外层循环每执行一次,内层循环执行一遍 for (int i = 1; i <= 9; i++) { // 外层控制的是行数 for (int j = 1; j <= i; ...

  2. 带标签的循环语句、switch

    今天继续更新,控制流程的剩余部分内容,带标签的循环语句中的continue/break 的使用方法,以及switch关键字的使用方法.例1:带标签的continue/break.package com ...

  3. java基础08 双重循环打印图形

    public class Double01 { /** * 若有3个班级各4名学员参赛, * 如何计算每个班级参赛学员的平均分? */ public static void main(String[] ...

  4. Python基础—05-总结:双重循环,数据类型

    总结 双重循环 冒泡排序 lt = [1, 5, 7, 3, 2, 4] # 计算元素的个数 n = len(lt) # 外层循环控制圈数 for i in range(n-1): for j in ...

  5. YTU 2690: 用双重循环实现小九九

    2690: 用双重循环实现小九九 时间限制: 1 Sec  内存限制: 128 MB 提交: 848  解决: 573 题目描述 小九九是我们小时候常背的的乘法算术法则,现在用双重循环来实现小九九 1 ...

  6. vue标签内循环数据逗号分隔

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 输出简单图形(StringBuilder代替双重循环)

    在有些题目中打印简单图形必须使用StringBuilder或者StringBuffer,否则会运行超时(用String都会超时). 因为在题目的要求中说到输入的n是小于1000的,用双重循环就会超时, ...

  8. doT模板双重循环模板渲染方法

    doT模板作为一个前端渲染模板,有着非常显著的有点.1.轻量.2.快捷.3.无依赖. 本文介绍一种几乎所有模板都会遇到的问题,双重循环渲染.我们知道在dot模板中循环渲染用的是{{~ it:value ...

  9. shell脚本———双重循环——九九乘法表

    1.基础双重循环模板 2.break跳出单个循环 3.continue中止某次循环中的命令,但不会完全中止整个命令 4.九九乘法表

随机推荐

  1. Android开发者需要面对的8大挑战

    移动开发变得越来越受欢迎,但移动开发者正面临着一系列挑战.本文将介绍的是Android开发者需要面对的8个不利因素,例如缺乏硬件标准化,以及软件碎片.为Android OS开发app,给予了开发人员极 ...

  2. Python & MapReduce

    使用Python实现Hadoop MapReduce程序 原文请参考: http://blog.csdn.net/zhaoyl03/article/details/8657031/ 下面只是将mapp ...

  3. WPF NotifyIcon and Taskbar 任务栏示例

    Demo Source 转自:http://www.codeproject.com/Articles/36788/WPF-XAML-NotifyIcon-and-Taskbar-System-Tray ...

  4. jquery mobile转场时加载js失效(转)

    jquery mobile拦截了所有的http请求,并使用ajax请求取代传统的http.请求发出后,框架会将请求的内容插入到页面中data- role="page"的部分,取代原 ...

  5. protoc的protoc-gen-grpc-java插件

    编译 protoc-gen-grpc-java插件 的文档在: https://github.com/grpc/grpc-java/tree/master/compiler  编译的步骤: Chang ...

  6. eclipse打jar包步骤

    eclipse->文件->export->java->JAR file 选择项目,Options增加Add directory entries finish hadoop ja ...

  7. 【转】windows和linux间共享互传文件

    原文:http://blog.guorunmin.cn/2015/09/16/windows%E5%92%8Clinux%E9%97%B4%E5%85%B1%E4%BA%AB%E4%BA%92%E4% ...

  8. How to Modify Public Network Information including VIP in Oracle Clusterware (文档 ID 276434.1)

    APPLIES TO: Oracle Database - Enterprise Edition - Version 11.2.0.3 to 12.1.0.2 [Release 11.2 to 12. ...

  9. JNI_Android项目中调用.so动态库实现详解【转】

    转自 http://www.cnblogs.com/sevenyuan/p/4202759.html 1. 在Eclipse中创建项目:TestJNI 2. 新创建一个class:TestJNI.ja ...

  10. 移动开发 android 入门开发 阶段视频

    一直想把 android 的开发学习录制成视频,这里录制了一部分供大家学习. http://www.chuanke.com/s5402069.html 到这里,文档,源码,视频基本就全了,祝愿大家能够 ...