【问题标题】:ListView - Show LayoutTemplate on empty data sourceListView - 在空数据源上显示 LayoutTemplate
【发布时间】:2010-10-21 17:59:49
【问题描述】:

对于购物车页面,商品列表显示在 html 表格中。 我为此使用了 ListView,效果很好。

当购物车为空时,会出现“此购物车为空”的文字。但它只呈现 EmptyDataTemplate 中的代码。我的目标是显示表格标题(“删除”、“产品”、“数量”等),而无需在 EmptyDataTemplate 中重复该 html 代码。

为了聪明,我将 EmptyDataTemplate 更改为 EditItemTemplate 并使用下面显示的代码。

谁能想到一个更优雅的解决方案来解决这个问题?

[C#代码]

    lvShoppingCart.DataSource = _cart.Items;
    lvShoppingCart.DataBind();


    if (_cart.ProductCount == 0)
    {
        lvShoppingCart.DataSource = new List<string>() { "dummy cart item" };
        lvShoppingCart.EditIndex = 0;
        lvShoppingCart.DataBind();
    }

[ASPX 代码]

    <asp:ListView ID="lvShoppingCart" runat="server">
        <LayoutTemplate>
            <table style="width: 600px;" border="0" cellspacing="0" cellpadding="0">
                <tr>
                    <td>
                        <table border="0" cellspacing="0" cellpadding="0">
                            <tr>
                                <td width="50">
                                    <strong>Delete</strong>
                                </td>
                                <td width="400">
                                    <strong>Product</strong>
                                </td>
                                <td width="100">
                                    <strong>Quantity</strong>
                                </td>
                                <td width="100">
                                    <strong>Price</strong>
                                </td>
                                <td width="100">
                                    <strong>Total</strong>
                                </td>
                            </tr>
                        </table>
                        <hr />
                    </td>
                </tr>
                <tr id="itemPlaceHolder" runat="server">
                </tr>
                <tr id="trShoppingCartUpdateBtn" runat="server">
                    <td>
                        <table width="100%" border="0" cellspacing="0" cellpadding="0">
                            <tr>
                                <td width="50">
                                    &nbsp;
                                </td>
                                <td width="400">
                                    &nbsp;
                                </td>
                                <td colspan="3" width="300">
                                    <table border="0" cellspacing="0" cellpadding="0">
                                        <tr>
                                            <td>
                                                <asp:ImageButton ID="btnImgUpdateQuantities" ImageUrl="../img/refresh.gif" AlternateText="update shopping cart"
                                                    OnClick="btnUpdateQuantities_Click" runat="server" />
                                            </td>
                                            <td>
                                                <asp:LinkButton ID="btnUpdateQuantities" Text="update cart" OnClick="btnUpdateQuantities_Click"
                                                    runat="server" />
                                            </td>
                                        </tr>
                                    </table>
                                </td>
                            </tr>
                        </table>
                    </td>
                </tr>
                <tr id="trShoppingCartTotals" runat="server">
                    <td>
                        <table width="100%" border="0" cellspacing="0" cellpadding="0">
                            <tr>
                                <td colspan="4">
                                    <div align="right">
                                        <strong>Totals: </strong>
                                    </div>
                                </td>
                                <td width="100">
                                    <asp:Label ID="lblCartTotal" runat="server" Text="0" />
                                </td>
                            </tr>
                        </table>
                    </td>
                </tr>
            </table>
        </LayoutTemplate>
        <EditItemTemplate>
            <tr>
                <td colspan="5" align="center">
                    <p>
                        <em>This cart is empty.</em>
                    </p>
                </td>
            </tr>
        </EditItemTemplate>
        <ItemTemplate>
            <tr>
                <td>
                    <table width="100%" border="0" cellspacing="0" cellpadding="0">
                        <tr>
                            <td width="50">
                                <a href='<%# ShoppingCartUrl %>?action=remove&id=<%# Eval("Product.Id") %>'>X</a>
                            </td>
                            <td width="400">
                                <%# Eval("Product.DisplayName") %>
                            </td>
                            <td width="100">
                                <label>
                                    <asp:TextBox ID="txtQuantity" Text='<%# Eval("Quantity") %>' runat="server" size="3" />
                                </label>
                            </td>
                            <td width="100">
                                <%# Eval("Price", "{0:C}") %>
                            </td>
                            <td width="100">
                                <%# Eval("TotalPrice", "{0:C}") %>
                            </td>
                        </tr>
                    </table>
                    <hr />
                </td>
            </tr>
        </ItemTemplate>
    </asp:ListView>

【问题讨论】:

    标签: c# asp.net templates listview


    【解决方案1】:

    您可以添加一个空的 InsertItemTemplate 并设置 InsertItemPosition="LastItem"

    【讨论】:

    • 查看其他答案以获取示例
    【解决方案2】:

    您可以在下面找到购物车代码的简化示例。 它正在使用 user757933 的答案中提供的“InsertItemTemplate”解决方案。 我发现这是一个比使用需要“虚拟”数据源的“EditItemTemplate”更优雅的解决方案。

    用法: 默认情况下,您应该会看到一个空购物车。当您取消注释“面包”、“苹果”和“鸡蛋”的行时,应该隐藏“此购物车是空的”消息,相反您会看到购物车中出现这三个项目。

    [ASPX 代码]

    <asp:ListView ID="lvShoppingCart" runat="server">
        <LayoutTemplate>
            <pre>
            ---------------------------------------------------------------------------
            | Product           | Quantity           | Price           | Total        |
            ---------------------------------------------------------------------------
            <div id="itemPlaceHolder" runat="server">
            </div>
            ---------------------------------------------------------------------------
            |                                                          | <asp:Label ID="lblCartTotal" runat="server" Text="0" />    |
            ---------------------------------------------------------------------------
            </pre>
        </LayoutTemplate>
        <InsertItemTemplate>
            | This cart is empty                                                      |
        </InsertItemTemplate>
        <ItemTemplate>
            | <%# Container.DataItem.ToString().PadRight(17) %> |                    |                 |              |
        </ItemTemplate>
    </asp:ListView>
    

    [C#代码]

        internal class Cart : IEnumerable<string>
        {
            public List<string> Items { get; set; }
    
            public Cart()
            {
                Items = new List<string>();
            }
    
            public IEnumerator<string> GetEnumerator()
            {
                return Items.GetEnumerator();
            }
    
            IEnumerator IEnumerable.GetEnumerator()
            {
                return GetEnumerator();
            }
        }
    
        protected void Page_Load(object sender, EventArgs e)
        {
            Cart _cart = new Cart();
            //_cart.Items.Add("bread");
            //_cart.Items.Add("apples");
            //_cart.Items.Add("eggs");
    
            lvShoppingCart.DataSource = _cart;
            // Make sure the 'InsertItemTemplate' is hidden from view when items are added to the cart.
            lvShoppingCart.InsertItemPosition = _cart.Items.Count == 0 ? InsertItemPosition.LastItem : InsertItemPosition.None;
            lvShoppingCart.DataBind();
    
            Label _lblCartTotal = lvShoppingCart.FindControl("lblCartTotal") as Label;
            if (_lblCartTotal != null)
            {
                _lblCartTotal.Text = string.Format("<strong>Total: </strong> {0}", _cart.Items.Count);
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      • 2015-02-19
      相关资源
      最近更新 更多