Listview inside Listview or Repeat inside Repeat?

Asked

Viewed 399 times

0

I need to display some products divided by category, the categories are created by the user and both come from the database TB_CATEGORIA, TB_PRODUTOS, has how to do with Listview, Repeat? For example:

Special

Product 1 Product 2

Books

Book 1 Book 2

Ancient

Product 1 Product 2

  • It is possible to make the infamous "Nested Repeaters" or "Nested Listviews" of life yes, and this will probably solve your problem, but I will confess that putting a Repoter inside the other gave me a huge headache on account of some unfortunate details of their implementation. just write "nested Repeater" in google and you will see and flood of questions related to it (my event does not fire, my data does not load, etc)

2 answers

1

Aspx:

<form id="form1" runat="server">
    <asp:Repeater ID="rptCategorias" runat="server">
        <ItemTemplate>
            <asp:Label ID="lblCategoria" runat="server" Text='<%# Bind("Nome") %>'></asp:Label><br />
            <asp:Repeater ID="rptProdutos" runat="server">
                <ItemTemplate>
                    <asp:Label ID="lblProduto" runat="server" Text='<%# Bind("Nome") %>'></asp:Label>
                </ItemTemplate>
            </asp:Repeater>
            <br />
            <br />
        </ItemTemplate>
    </asp:Repeater>
</form>

Aspx.Cs:

public partial class _default : Page
{

    private DataSet1 ds = new DataSet1();

    protected void Page_Load(object sender, EventArgs e)
    {
        ds.TB_CATEGORIA.AddTB_CATEGORIARow(1, "Especiais");
        ds.TB_PRODUTOS.AddTB_PRODUTOSRow(1, ds.TB_CATEGORIA.FindById(1), "Produto 1");
        ds.TB_PRODUTOS.AddTB_PRODUTOSRow(2, ds.TB_CATEGORIA.FindById(1), "Produto 2");

        ds.TB_CATEGORIA.AddTB_CATEGORIARow(2, "Livros");
        ds.TB_PRODUTOS.AddTB_PRODUTOSRow(3, ds.TB_CATEGORIA.FindById(2), "Livro 1");
        ds.TB_PRODUTOS.AddTB_PRODUTOSRow(4, ds.TB_CATEGORIA.FindById(2), "Livro 2");

        ds.TB_CATEGORIA.AddTB_CATEGORIARow(3, "Antigos");
        ds.TB_PRODUTOS.AddTB_PRODUTOSRow(5, ds.TB_CATEGORIA.FindById(3), "Antigos 1");
        ds.TB_PRODUTOS.AddTB_PRODUTOSRow(6, ds.TB_CATEGORIA.FindById(3), "Antigos 2");

        rptCategorias.DataSource = ds;
        rptCategorias.DataMember = "TB_CATEGORIA";
        rptCategorias.ItemDataBound += rptCategorias_ItemDataBound;
        rptCategorias.DataBind();
    }

    protected void rptCategorias_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            var rptProdutos = (Repeater)e.Item.FindControl("rptProdutos");
            var row = ((DataRowView) e.Item.DataItem).Row;

            rptProdutos.DataSource = row.GetChildRows(ds.Relations["TB_CATEGORIA_TB_PRODUTOS"]);
            rptProdutos.DataBind();
        }
    }

}
  • And if the second Repeater has Itemcommand, Itemcreated?

0

In aspx, include inside Itemtemplate

<asp:LinkButton runat="server" ID="btnEdit" CommandName="Edit" 
CommandArgument='<%# Bind("Id") %>' Text="Add"></asp:LinkButton>

In the codebehind, include in the event rptCategorias_ItemDataBound

rptProdutos.ItemCommand += rptProdutos_ItemCommand;

Create the event

private void rptProdutos_ItemCommand(object source, RepeaterCommandEventArgs e)
{
    switch (e.CommandName)
    {
        case "Edit":
            // Your code
            break;
    }
}

Browser other questions tagged

You are not signed in. Login or sign up in order to post.