2009-04-09 6 views
2

사용자 정의 컨트롤을 사용하여 장바구니 항목 집합을 렌더링하려고합니다. 각 장바구니 항목은 사용자 정의 컨트롤의 단추를 통해 제거 할 수 있습니다. 장바구니 아이템이 제거되면 나는 그것이 제거임을 시각적으로 보여줄 필요가 있습니다. 그러나 장바구니 항목이 페이지를로드하는 동안 존재했기 때문에 페이지가 다시 새로 고쳐질 때까지 남아 있습니다. 내가 한 것은 cartitem을 제거하는 작업이 완료된 후 페이지를 새로 고치는 방법입니다. 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

선택한 대답을 반영하도록 개정 됨 – ahsteele

답변

2

CartItemControls를 init의 Content 's Controls 컬렉션에 추가하는 것처럼 RemoveCartItem_Command에서 CartItemControls를 제거해야합니다. 그렇게하려면 ItemRemoved 이벤트를 노출하고 기본 페이지에서 처리하거나 RemoveCartItem_Command 내부에서 Parent.Controls.Remove (this)를 호출하여 처리하십시오.

아니면 뭔가 빠졌습니까?

+0

+1 이벤트 노출시 – eglasius

0
에 대한 CartItemControl.ascx

에 대한

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> 

코드 숨김

는 cart.aspx.cs 뒤에 코드는 아래와 같다

응답. 장바구니 항목을 제거하기 위해 작업을 수행 한 후 페이지로 다시 응답하십시오.

+0

이 옵션을 생각했지만 실제로 유일한 옵션입니까? 확실히 가장 쉬운 방법이지만 다른 포스트 백 데이터를 잃지는 않습니까? – ahsteele

0

동일 문구에 Server.Transfer 시도해주세요.

그렇다면, Ruslan 접근법을 사용하려면 ItemRemoved 이벤트를 노출하고 메인 페이지에서 처리하는 것이 좋습니다. Content.Controls.Clear를 수행하고 CreateCartItemControls를 다시 호출 할 수 있습니다.

0

모든 포스트 백마다 기본 페이지의 모든 것을 리 바인드하십시오.