zoukankan      html  css  js  c++  java
  • 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 = 0; 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 = 0; 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 = 0; 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个小时,最后通过删除母板逐句排除才找到原因,希望对大家有用。

    荆州古城

  • 相关阅读:
    LeetCode 295. Find Median from Data Stream (堆)
    LeetCode 292. Nim Game(博弈论)
    《JavaScript 模式》读书笔记(4)— 函数2
    《JavaScript 模式》读书笔记(4)— 函数1
    《JavaScript 模式》读书笔记(3)— 字面量和构造函数3
    《JavaScript 模式》读书笔记(3)— 字面量和构造函数2
    《JavaScript 模式》读书笔记(3)— 字面量和构造函数1
    《JavaScript 模式》读书笔记(2)— 基本技巧3
    《JavaScript 模式》读书笔记(2)— 基本技巧2
    《JavaScript 模式》读书笔记(2)— 基本技巧1
  • 原文地址:https://www.cnblogs.com/gosky/p/3398572.html
Copyright © 2011-2022 走看看