У меня есть ListView, отображающий продукты.Я пытаюсь добавить ярлык категории перед каждым списком товаров, где в каждой категории может быть несколько товаров.Я пытаюсь достичь этого, не вкладывая ListViews.В данный момент проблема заключается в том, что оно повторяет название категории над каждым названием продукта.Это не то, что я хочу.Я хочу, чтобы он отображал название категории для продуктов только при изменении названия категории.И Продукт, и Категория возвращаются из одной и той же таблицы БД.
Категория 1
Продукт 1
Продукт 2
Категория 2
Продукт 3
Продукт 4
<asp:ListView ID="classesList" ItemPlaceholderID="classesPlaceHolder"
OnItemDataBound="ClassesList_ItemDataBound" runat="server">
<LayoutTemplate>
<asp:Panel ID="classesPanel" CssClass="classesPanel" runat="server">
<asp:PlaceHolder runat="server" ID="classesPlaceHolder"></asp:PlaceHolder>
</asp:Panel>
</LayoutTemplate>
<ItemTemplate>
<strong><asp:Label ID="categoryNameLabel" runat="server"></asp:Label></strong>
<a href='#'><%# Eval("product_name") %></a><br />
</ItemTemplate>
</asp:ListView>
protected void ClassesList_ItemDataBound(object sender, ListViewItemEventArgs e)
{
if (e.Item.ItemType == ListViewItemType.DataItem)
{
DataRowView row = (DataRowView)e.Item.DataItem;
Label categoryNameLabel = e.Item.FindControl("categoryNameLabel") as Label;
if (!categoryNameLabel.Text.Contains(row["cat_name"].ToString()))
{
categoryNameLabel.Text = row["cat_name"].ToString() + "<br />";
}
}
}
Выполнение этого в цикле будет тривиальным.Но поскольку событие ItemDataBound срабатывает для каждого возвращаемого элемента данных, я пытаюсь найти простой способ сделать это.
UPDATE
Я переместил привязку данныхиз метода загрузки страницы в метод с именем GetClasses ().Этот новый метод вызывается с первой загрузки страницы.Я отказался от метода ItemDataBound, поскольку хотел реализовать цикл и переключать видимость categoryLabel.К сожалению, сейчас ни одна категория не появляется, так что, может быть, я что-то упустил?
<ItemTemplate>
<strong><asp:Label ID="categoryNameLabel" Visible="false" runat="server"></asp:Label></strong>
<i class="fa fa-angle-double-right" aria-hidden="true"></i>
<a href='#'><%# Eval("product_name") %></a><br />
</ItemTemplate>
public void GetClasses()
{
DataSet ds = CatalogDALC.GetClassesByCategory(categoryID, DateTime.Now);
classesList.DataSource = ds;
classesList.DataBind();
// Set main category header for classes - loop here and set category name headers
int count = 0;
foreach (ListViewDataItem item in classesList.Items)
{
Label categoryNameLabel = item.FindControl("categoryNameLabel") as Label;
if (count == 0) // Set the first category name header regardless
{
categoryNameLabel.Text = ds.Tables[0].Rows[count]["cat_name"].ToString() + "<br />";
categoryNameLabel.Visible = true;
}
else
{
if (ds.Tables[0].Rows[count-1]["cat_name"].ToString() != ds.Tables[0].Rows[count]["cat_name"].ToString())
{
categoryNameLabel.Text = ds.Tables[0].Rows[count]["cat_name"].ToString() + "<br />";
categoryNameLabel.Visible = true;
}
else
{
categoryNameLabel.Visible = false;
continue;
}
}
count++;
}
}