2009-04-09 4 views
2

ユーザーコントロールを使用してカートアイテムのセットをレンダリングする作業を進めています。各カートアイテムは、ユーザーコントロールのボタンを使用して削除できます。カートアイテムが削除されると、そのアイテムが削除されていることを視覚的に示す必要があります。しかし、カートアイテムはページのロード中に存在していたため、ページが再びリフレッシュされるまでカートアイテムは残っていました。私が何をしているのは、カートアイテムを取り除く作業が完了した後にページを更新する手段です。ユーザーコントロールポストバック

cart.aspx.csの背後にあるコードは次のようになります。ユーザーコントロールCartItemControl.ascx.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(); 
} 

マークアップ

<%@ 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> 
CartItemControl.ascx

のコード
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); 
    } 
} 
} 
+0

選択された回答を反映するように改訂 – ahsteele

答えて

2

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

何か不足していますか?

+0

+1イベントを公開する – eglasius

0

レスポンス。カートアイテムを取り外す作業を行った後、ページに戻ってリダイレクトします。

+0

私はこのオプションを考えましたが、本当に唯一の選択肢ですか?確かに最も簡単ですが、他のポストバックデータは失われませんか? – ahsteele

0

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

0

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