代码之家  ›  专栏  ›  技术社区  ›  mathijsuitmegen

ListView-在空数据源上显示LayoutTemplate

  •  2
  • mathijsuitmegen  · 技术社区  · 14 年前

    对于购物车页面,项目列表显示在html表中。 我用了一个列表视图,效果很好。

    当购物车为空时,将显示文本“此购物车为空”。但它只呈现空数据模板中的代码。我的目标是显示表头('delete'、'product'、'quantity'等),而不重复EmptyDataTemplate中的html代码。

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

    有谁能想出一个更优雅的方法来解决这个问题吗??

        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>
    
    2 回复  |  直到 14 年前
        1
  •  2
  •   user757933    13 年前

    可以添加空的 插入项模板 inserttemposition=“最后一项”

        2
  •  0
  •   mathijsuitmegen    11 年前

    下面是购物车代码的简化示例。 它正在使用用户757933的答案中提供的“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>
    

    [代码]

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