2009-04-09 4 views
2

Je travaille sur le rendu d'un ensemble d'éléments de chariot en utilisant un contrôle utilisateur. Chaque article du panier peut être retiré via un bouton dans le contrôle de l'utilisateur. Quand un article de chariot est enlevé je dois montrer visuellement son enlèvement. Cependant, étant donné que l'article du panier existait pendant le chargement de la page, il reste jusqu'à ce que la page soit actualisée à nouveau. Ce que je suis après est un moyen d'actualiser la page après que le travail pour enlever le cartel a été complété.Postback de contrôle d'utilisateur

Le code derrière cart.aspx.cs ressemble:

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

Markup pour 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> 

code derrière le UserControl CartItemControl.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); 
    } 
} 
} 
+0

révisé pour refléter la réponse sélectionnée – ahsteele

Répondre

2

Tout comme vous ajoutez CartItemControls à la collection Controls de Content sur init, vous devez les supprimer sur RemoveCartItem_Command. Faites-le en exposant votre propre événement ItemRemoved et en le manipulant dans la page principale ou en appelant Parent.Controls.Remove (this) à l'intérieur de RemoveCartItem_Command.

Ou est-ce qu'il me manque quelque chose?

+0

+1 pour exposer un événement – eglasius

0

Response.Redirect revenir à la page après avoir fait le travail pour supprimer l'article du panier.

+0

J'ai pensé à cette option mais est-ce vraiment la seule option? C'est certainement le plus facile mais ne perdrait-il pas d'autres données de publication? – ahsteele

0

Essayez Server.Transfer sur la même page. Cela dit, pensez à utiliser l'approche Ruslan, en exposant un événement ItemRemoved et en le manipulant sur la page principale. Vous pouvez faire Content.Controls.Clear et appeler à nouveau CreateCartItemControls.

0

Juste redéfinir le tout sur la page principale à chaque publication.