• 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个小时,最后通过删除母板逐句排除才找到原因,希望对大家有用。

    荆州古城

  • 相关阅读:
    Java ES api 查询例子
    leveldb学习
    Viewstamp Replication协议
    PacificA协议
    vhost架构
    数据分片方法
    常见分布式存储系统架构分析
    数据存储(B+树 vs LSM树)
    paxos算法理解
    Raft协议理解
  • 原文地址:https://www.cnblogs.com/gosky/p/3398572.html
Copyright © 2020-2023  润新知