【问题标题】:Bind 5 items in each row of repeater每行repeater绑定5个item
【发布时间】:2012-07-04 11:09:38
【问题描述】:

我有一组来自数据库的项目。他们的数量可能会有所不同。我已将它们绑定在中继器中。现在我下面的例子将解释我想要什么:
我有 11 个来自数据库的项目,我希望它们按每行 5 个项目分组。

  • 第一行:5 项。
  • 第二行:5 项。
  • 第三行:1 项。

目前,我只是将它们绑定在转发器中。我该怎么做?

【问题讨论】:

  • 为什么不使用定义列的列表视图?
  • 您希望这些项目如何分组?你的意思是GROUP他们BY一个特定的列?你想连接它们吗?
  • @Furqan 你能举个例子吗
  • @MahmoudGamal 我只希望他们以 5 人一组的形式出现。不要按任何类型对它们进行分组。
  • 所有答案都有帮助。但我接受了对我有用的那个。向所有其他人 +1。

标签: c# asp.net sql repeater


【解决方案1】:

是的。有可能:

<asp:Repeater ID="rptItems" runat="server">
           <ItemTemplate>
               <asp:Literal runat="server" Text='<%# Eval("Value") %>'></asp:Literal>
               <div style="clear: both" runat="server" Visible="<%# (Container.ItemIndex+1) % 5 == 0 %>"></div>
           </ItemTemplate>
       </asp:Repeater>

它对数字序列产生以下结果:

1 2 3 4 5

6 7 8 9 10

11 12 13 14 15

16 17 18 19 20

【讨论】:

  • 很好的替代 块。
【解决方案2】:

如果你可以使用 ListView,那么你可以使用 GroupItemCount 。像这样的东西MSDN Example

<asp:ListView ID="ContactsListView" 
        DataSourceID="yourDatasource" 
        GroupItemCount="5"        
        runat="server">
        <LayoutTemplate>
          <table id="tblContacts" runat="server" cellspacing="0" cellpadding="2">
            <tr runat="server" id="groupPlaceholder" />
          </table>

        </LayoutTemplate>
        <ItemTemplate>
          <div> your Items here </div>
        </ItemTemplate>
        <GroupTemplate>
          <tr runat="server" id="ContactsRow" style="background-color: #FFFFFF">
            <td runat="server" id="itemPlaceholder" />
          </tr>
        </GroupTemplate>
        <ItemSeparatorTemplate>
          <td runat="server" style="border-right: 1px solid #00C0C0">&nbsp;</td>
        </ItemSeparatorTemplate>
      </asp:ListView>

【讨论】:

    【解决方案3】:

    如果你想坚持使用中继器,我可以考虑两种方法。

    首先,您可以坚持使用平面项目列表,并让中继器在每 5 个项目之后插入一个“新行”。您应该可以在 &lt;ItemTemplate&gt; 中使用类似

    的块来执行此操作
    <% if ((Container.DataItemIndex % 5) == 4) { %>
        </div>
        <div>
    <% } %>
    

    说实话,这不是很好。

    或者,您可以使用MoreLINQBatch 方法将您的项目批量处理为IEnumerables,共5 个,然后使用两个嵌套 转发器来呈现它们。设置外转发器将内转发器包裹在&lt;div&gt;标签中,并设置内转发器的DataSource='&lt;%# Container.DataItem %&gt;'。这应该会产生更清晰的标记。

    【讨论】:

    • 在reapter控制中,不能使用带有if语句的Container
    【解决方案4】:

    你可以在下面试试,我说错了ListView,其实我说的是DataList

        <asp:DataList ID="DataList1" runat="server" RepeatColumns="5" 
            RepeatDirection="Horizontal" RepeatLayout="Flow">
            <ItemTemplate >
                <%--Your Item Data goes here--%>
            </ItemTemplate>            
        </asp:DataList>
    

    【讨论】:

      【解决方案5】:

      您可以使用嵌套数据控件(即Repeater)并处理OnItemDataBound事件来绑定内部Repeater。

      示例数据源组件:

      public class Item
      {
          public int ID { get; set; }
          public string Name { get; set; }
      
          public static List<List<Item>> getItems()
          {
              List<Item> list = new List<Item>()
              {
                      new Item(){ ID=11, Name="A"},
                      new Item(){ ID=12, Name="B"},
                      new Item(){ ID=13, Name="C"},
                      new Item(){ ID=14, Name="D"},
                      new Item(){ ID=15, Name="E"},
              };
      
              /* Split the list as per specified size */
      
              int size = 2;
              var lists = Enumerable.Range(0, (list.Count + size - 1) / size)
                          .Select(index => list.GetRange(index * size,
                              Math.Min(size, list.Count - index * size)))
                          .ToList();
      
              return lists;
          }
      }
      

      标记 (.aspx)

      <asp:Repeater ID="outerRepeater"
                  runat="server" onitemdatabound="outerRepeater_ItemDataBound"
                  >
          <ItemTemplate>
          <p>
          Row
          </p>
          <asp:Repeater ID="innerRepeater"
                          runat="server">
              <ItemTemplate>
                  <asp:Literal ID="literal1" runat="server" Text='<%# Eval("ID") %>' />
                  <asp:Literal ID="literal2" runat="server" Text='<%# Eval("Name") %>' />
              </ItemTemplate>              
          </asp:Repeater>
          </ItemTemplate>              
      </asp:Repeater>
      

      代码隐藏

      protected void Page_Load(object sender, EventArgs e)
      {
          if (!IsPostBack)
          {
              outerRepeater.DataSource = Item.getItems();
              outerRepeater.DataBind();
          }
      }
      protected void outerRepeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
      {
          Repeater repeater = e.Item.FindControl("innerRepeater") as Repeater;
          repeater.DataSource = Item.getItems()[e.Item.ItemIndex];
          repeater.DataBind();
      }
      

      【讨论】:

        【解决方案6】:
         <asp:Repeater ID="Repeater1" runat="server"
          OnItemDataBound="Repeater1_databinding">
        
                        <HeaderTemplate>
                            <table id="masterDataTable" class="reportTable list issues" width="100%">
                                <thead>
                                    <tr>
                                        <asp:Literal ID="literalHeader" runat="server"></asp:Literal>
                                    </tr>
                                </thead>
                                <tbody>
                        </HeaderTemplate>
                        <ItemTemplate>
                            <tr>
                                <asp:Literal ID="literals" runat="server"></asp:Literal>
                            </tr>
                        </ItemTemplate>
                        <FooterTemplate>
                            </tbody> </table>
                        </FooterTemplate>
                    </asp:Repeater>
            <input id="hdnColumnName" runat="server" clientidmode="Static" type="hidden" />
            <input id="hdnColumnOrder" runat="server" clientidmode="Static" type="hidden" />
        
        
        // javascript Function
        
         <script type="text/javascript">
            $(document).ready(function () {
                $('#ddlReport').removeClass('required');
                $('.sort').click(function () {
                    $('#hdnColumnName').val($(this).text());
                    $('#hdnColumnOrder').val($(this).attr('class'));
                    $(this).toggleClass("desc asc");
                    $("#lnkSort").click();
                });
            });
        </script>
        
         // Bind repeater
        
               DataTable dt = objReport.GetCustomRecord();
                fn = new List<string>();
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    if (dt.Columns[i].ColumnName != "Maxcount" )
                    {
                        fn.Add(dt.Columns[i].ColumnName);
                    }
                }
        
                Repeater1.DataSource = dt;
                Repeater1.DataBind();
        
        
        
        protected void Repeater1_databinding(object sender, RepeaterItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Header)
            {
                if (e.Item.FindControl("literalHeader") != null)
                {
                    StringBuilder sb = new StringBuilder();
                    Literal li = e.Item.FindControl("literalHeader") as Literal;
        
                    fieldName().ForEach(delegate(string fn)
                    {
                        if (hdnColumnName.Value != fn.ToString())
                        {
                            sb.Append("<th width=\"10%\"> <a id=\"btnCustomerName\" class=\"sort desc\" onclick=\"btnSorts_onclick()\" style=\"cursor:pointer;text-decoration: none !important;\" >"
                                + fn.ToString() + "</a></th>");
                        }
                        else
                        {
                            if (hdnColumnOrder.Value == "sort asc")
                                sb.Append("<th width=\"10%\"> <a id=\"btnCustomerName\" class=\"sort desc\"  onclick=\"btnSorts_onclick()\" style=\"cursor:pointer;text-decoration: none !important;\" >"
                               + fn.ToString() + "</a></th>");
                            else
                                sb.Append("<th width=\"10%\"> <a id=\"btnCustomerName\" class=\"sort asc\" onclick=\"btnSorts_onclick()\" style=\"cursor:pointer;text-decoration: none !important;\">"
                                                           + fn.ToString() + "</a></th>");
                        }
                    });
                    li.Text = sb.ToString();
        
                }
        
            }
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                if (e.Item.FindControl("literals") != null)
                {
                    DataRowView drv = (DataRowView)e.Item.DataItem;
                    Literal li = e.Item.FindControl("literals") as Literal;
                    StringBuilder sb = new StringBuilder();
                    fieldName().ForEach(delegate(string fn)
                    {
                        sb.Append("<td>" + drv[fn.ToString()] + "</td>");
                    });
                    li.Text = sb.ToString();
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-11
          • 2011-06-30
          • 2013-11-02
          相关资源
          最近更新 更多