2

ユーザーコントロールを使用してカートアイテムのセットをレンダリングする作業をしています。各カートアイテムは、ユーザーコントロールのボタンを使用して削除できます。カートアイテムが削除されたら、それが削除されたことを視覚的に示す必要があります。ただし、カートアイテムはページの読み込み中に存在していたため、ページが再度更新されるまで残ります。私が求めているのは、カートアイテムを削除する作業が完了した後にページを更新する手段です。

cart.aspx.csの背後にあるコードは次のようになります。

protected void Page_Init(object sender, EventArgs e)
{
    CreateCartItemControls();
}

private void CreateCartItemControls()
{
    foreach (CartItem ci in Profile.Cart.Items)
    {
        ASP.CartItemControl cic = new ASP.CartItemControl();
        cic.ItemName = ci.Name;

        cic.CartID = ci.ID;
        cic.Cost = ci.BaseCost.ToString("c");
        cic.ItemComponents = ci.Components;

        cic.CartItemRemoved += new EventHandler(CartItemRemoved);

        Content.Controls.Add(cic);
    }
}

void CartItemRemoved(object sender, EventArgs e)
{
    Master.UpdateCartItemCount();
}

CartItemControl.ascxのマークアップ

<%@ Control Language="C#" ClassName="CartItemControl" AutoEventWireup="true"
    CodeFile="CartItemControl.ascx.cs"
    Inherits="UserControls_CartItemControl" %>
<fieldset id="FieldSet" runat="server">
    <legend>
        <asp:HyperLink ID="ItemLink" runat="server" />
    </legend>
    <asp:ImageButton ID="RemoveCartItem" AlternateText="Remove Item" 
        ImageUrl="~/img/buttons/remove_4c.gif" runat="server"
        CommandName="Remove" OnCommand="RemoveCartItem_Command" />
    <asp:Label ID="TotalItemCost" runat="server" Text="$0.00" />
    <ol>
        <li runat="server" id="ComponentsLI" visible="false">
            <fieldset id="ComponentsFieldSet" runat="server">
                <legend>Item Components</legend>
                <asp:CheckBoxList ID="ItemComponentsCheckList"
                    runat="server" />
            </fieldset>
        </li>
    </ol>
</fieldset>

UserControlCartItemControl.ascx.csのコードビハインド

public partial class UserControls_CartItemControl
: System.Web.UI.UserControl
{
public string ItemName { get; set; }
public int CartID { get; set; }
public string Cost { get; set; }
public IDictionary<int, SoftwareComponent> ItemComponents { get; set; }

protected void Page_PreRender(object sender, EventArgs e)
{
    SetCartItemControlAttributes();
}

private void SetCartItemControlAttributes()
{
    ItemLink.Text = ItemName;
    TotalItemCost.Text = Cost;

    RemoveCartItem.CommandArgument = CartID.ToString();

    if (!ItemComponents.Count.Equals(0))
    {
        ComponentsLI.Visible = true;
        foreach (KeyValuePair<int, ItemComponent> kvp in
            ItemComponents)
        {
            ItemComponentsCheckList.Items.Add(
                new ListItem(string.Format("{0} {1}",
                    kvp.Value.ComponentName,
                    kvp.Value.ComponentCost.ToString("c")),
                    kvp.Key.ToString()));
        }
    }
}

public event EventHandler CartItemRemoved;

protected void RemoveCartItem_Command(object sender, CommandEventArgs e)
{
    int itemID;

    if (int.TryParse(e.CommandArgument.ToString(), out itemID))
    {
        Profile.Cart.RemoveCartItem(itemID);
        CartItemRemoved(sender, e);
        Parent.Controls.Remove(this);
    }
}
}
4

4 に答える 4

2

CartItemControlsをinitのContent'sControlsコレクションに追加するのと同じように、RemoveCartItem_Commandでそれらを削除する必要があります。これを行うには、独自のItemRemovedイベントを公開してメインページで処理するか、RemoveCartItem_Command内でParent.Controls.Remove(this)を呼び出します。

それとも私は何かが足りないのですか?

于 2009-04-10T02:10:08.867 に答える
0

応答:カートアイテムを削除する作業を行った後、ページにリダイレクトしてください。

于 2009-04-09T22:25:03.510 に答える
0

Server.Transferを同じページに試してください。

そうは言っても、ItemRemovedイベントを公開し、メインページで処理することにより、Ruslanアプローチの使用を検討してください。Content.Controls.Clearを実行して、CreateCartItemControlsを再度呼び出すことができます。

于 2009-04-10T03:12:35.893 に答える
0

すべてのポストバックでメインページのすべてを再バインドするだけです。

于 2009-04-10T03:15:42.953 に答える