ListView ItemDataBound Issue - PullRequest
       9

ListView ItemDataBound Issue

0 голосов
/ 18 апреля 2019

У меня есть 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++;
       }
 }

1 Ответ

0 голосов
/ 19 апреля 2019

Мое обновленное решение в вопросе было правильным подходом - единственной ошибкой было утверждение продолжения - это обход счетчика. Это рабочая версия для всех, кто находится в подобной ситуации:

    <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;
                }
            }
            count++;
       }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...