Я не уверен в сложности данных продукта, которые вы sh отобразите. Тем не менее, я хотел бы предложить вам использовать вложенный Repeaters
, у одного повторителя будет название категории, а у второго - продукты. На Page_Load
вы должны выбрать все отдельные категории и связать первый ретранслятор. На ItemDataBound
первого ретранслятора вы должны выбрать продукты, относящиеся к категории, и связать вложенный ретранслятор.
например:
<asp:Repeater ID="rpt1" runat="server" OnItemDataBound="rpt1_ItemDataBound">
<ItemTemplate>
<asp:Label ID="lblCategory" runat="server" Text='<%# Eval("Category") %>'></asp:Label>
<asp:Repeater ID="rpt2" runat="server">
<ItemTemplate>
<asp:Label ID="lblProductName" runat="server" Text='<%# Eval("ProductName")%>'></asp:Label>
</ItemTemplate>
</asp:Repeater>
</ItemTemplate>
</asp:Repeater>
Загрузка страницы:
protected void Page_Load(object s, EventArgs e)
{
// Fetch All the Categories, Distinct Elements
DataTable dt = new DataTable();
dt.Columns.Add("Category");
dt.Rows.Add("Sanatizers");
dt.Rows.Add("Soaps");
rpt1.DataSource = dt;
rpt1.DataBind();
}
Данные элемента Ограничение:
protected void rpt1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
Label lblCategory = (Label)e.Item.FindControl("lblCategory");
Repeater rpt2 = (Repeater)e.Item.FindControl("rpt2");
if (lblCategory != null)
{
// Fetch products by category
var dt = new DataTable();
dt.Columns.Add("ProductName");
dt.Rows.Add("Dettol");
dt.Rows.Add("Safeguard");
dt.Rows.Add("Fair and Lovely");
rpt2.DataSource = dt;
rpt2.DataBind();
}
}
}
PS: Код не проверен, возможно, потребуется некоторая любовь.