2010-11-26 14 views
1

Ich bin brandneu auf asp, also denke ich, dass die Antwort leicht sein sollte, aber ich kann nicht herausfinden, was ich falsch mache. Dies ist eine sehr einfache Warenkorb Übung, die ich mache, um ASP zu lernen. Ich erstelle die Sitzung, füge Dinge hinzu und kann dann auf der Checkout-Seite Artikel einzeln aus dem Warenkorb entfernen. Wenn ich auf Entfernen klicke, wird das Objekt aus der Listbox entfernt, aber nicht aus der Sitzung. Ich weiß, dass es in der Sitzung weiter besteht, denn wenn ich auf den Link zur Einkaufsseite klicke, wird das Listenfeld auf der Einkaufsseite mit dem Element gefüllt, von dem ich dachte, dass ich es entfernt habe.Entfernen eines Wörterbucheintrags aus einem Sitzungsindex (ASP)

Ich habe versucht, es auf zwei verschiedene Arten zu entfernen, und ich bin mir nicht sicher, warum es nicht funktioniert.

Hinweis: Die Wörterbuchschlüssel sind die tatsächlichen Namen der Produkte, die zum Füllen der Listenfelder verwendet werden. Der Werteintrag ist die productID #, die ich gerade nicht verwende. Das Listenfeld auf der Einkaufsseite wird mit Daten aus einer SQL-Quelle gefüllt. SelectedItem.Text = Produktname (was angezeigt wird) und SelectedValue = productID (nicht verwendet).

Vielen Dank für Ihre Hilfe

//Default (shopping) page 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      //Create a new collection for the session indexer 
      ArrayList cart = (ArrayList)Session["scart"]; 

      //Need to initialize a new object in case it's null 
      if (cart == null) 
      { 
       cart = new ArrayList(); 
       Session["scart"] = cart; 
      } 

      //Show the shopping car listbox if there are items in it and the 
      //user returned from the checkout page 
      else pnlItems.Visible = true; 
      foreach (DictionaryEntry item in cart) 
      { 
       lbItems.Items.Add((string)item.Key); 
      } 
     } 
     //Show the shipping cart listbox containing the items the user just added 
     if (IsPostBack) pnlItems.Visible = true; 
    } 
    private void add_to_cart(string item, int value) 
    { 
     //Method to add the selected item to the collection/session indexer 
     ArrayList cart = (ArrayList)Session["scart"]; 
     cart.Add(new DictionaryEntry(item, value)); 
    } 
    protected void btnAddItem_Click(object sender, EventArgs e) 
    { 
     //Method to send the selected item to the add_to_cart method 
     string item = ddlProducts.SelectedItem.Text; 
     lbItems.Items.Add(item); 
     int value = int.Parse(ddlProducts.SelectedValue); 
     add_to_cart(item, value); 
    } 
    protected void ddlProducts_SelectedIndexChanged(object sender, EventArgs e) 
    { 

    } 

    protected void btnCheckOut_Click(object sender, EventArgs e) 
    { 
     //Send the user to the checkout page when the button is clicked 
     Response.Redirect("checkout.aspx", true); 
    } 

} 

//CheckoutPage: 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      //Populate the shopping cart on the checkout page with the items in the collection 
      ArrayList cart = (ArrayList)Session["scart"]; 
      foreach (DictionaryEntry item in cart) 
      { 
       lbCheckOut.Items.Add((string)item.Key); 
      } 
     } 
    } 
    protected void btnKillOrder_Click(object sender, EventArgs e) 
    { 
     //Kills the order by ending the session, then returns the user to the shopping page. 
     Session.Clear(); 
     Response.Redirect("Default.aspx", true); 
    } 
    protected void btnRemove_Click(object sender, EventArgs e) 
    { 
     //Removes the selected item from the shopping cart listbox and the session indexer 
     ArrayList cart = (ArrayList)Session["scart"]; 
     cart.Remove(lbCheckOut.SelectedItem.Text); 
     lbCheckOut.Items.Remove(lbCheckOut.SelectedItem.Text); 
     Session["scart"] = cart; 
     //Session.Remove(lbCheckOut.SelectedItem.Text); 
    } 
} 

Antwort

0

Sie sind in der Tat DictionaryEntry Instanzen auf den Sitzungszustand und fügte hinzu:

private void add_to_cart(string item, int value) 
{ 
    ArrayList cart = (ArrayList)Session["scart"]; 
    cart.Add(new DictionaryEntry(item, value)); 
} 

Aber Sie versuchen Saiten danach zu entfernen, die nicht arbeiten können:

Sie sollten den DictionaryEntry Schlüssel nachschlagen Ihr String und den Eintrag entfernen statt:

protected void btnRemove_Click(object sender, EventArgs e) 
{ 
    ArrayList cart = (ArrayList) Session["scart"]; 
    foreach (DictionaryEntry item in cart) { 
     if ((string) item.Key == lbCheckOut.SelectedItem.Text) { 
      cart.Remove(item); 
      break; 
     } 
    } 
} 
+0

Vielen Dank, das hat funktioniert! Ich hatte etwas Ähnliches vorher versucht, aber einen Aufzählungsfehler in der foreach Aussage bekommen. Da ich nicht wusste, wie ich es richtig debuggen sollte, gab ich auf und probierte die oben beschriebene Methode aus. Trotzdem danke! –

0

Das Problem ist, dass Ihr Session-Objekt eine Arraylist von Dictionary Instanzen enthält. Daher versucht cart.Remove(lbCheckOut.SelectedItem.Text) den Text mit einer DictionaryEntry-Instanz zu vergleichen und gibt jedes Mal false zurück. Es wäre einfacher, wenn Sie statt einer ArrayList eine echte Dictionary-Instanz in Session einfügen:

if (cart == null) 
{ 
    cart = new Dictionary<string,int>(); 
    Session["scart"] = cart; 
} 
... 

var cart = (Dictionary<string,int>)Session["scart"]; 
cart.Remove(lbCheckOut.SelectedItem.Text); 
Verwandte Themen