ListView ItemDataBound问题

时间:2019-04-18 16:41:23

标签: asp.net listview webforms

我有一个显示产品的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事件会针对返回的每个数据项触发,因此我试图找到一种简单的方法来实现此目的。

更新

我将数据绑定从“页面加载”方法移到了名为GetClasses()的方法。从首页加载开始调用此新方法。我想实现循环并切换categoryLabel的可见性时放弃了ItemDataBound方法。不幸的是,现在没有分类出现,所以也许我错过了什么?

    <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 :(得分:0)

我在问题中更新的解决方案是正确的方法-唯一的错误是continue语句-它绕过了计数器。这是类似情况下任何人的工作版本:

    <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++;
       }
 }