DavidBMedlem sedan jan. 20001 372 inlägg Tjena
Jag håller på och bygger en webshop och sitter just nu och grejar med kundvagnen. Kungvagnen ser ut så att jag radar upp alla produkter i en Table, till varje produkt finns det en linkbutton som om man klickar på gör en postback för att ta bort den aktuella produkten.
td = new TableCell();
LinkButton lb = new LinkButton();
lb.ID = dr["ID"].ToString();
lb.Text = "Ta bort";
lb.Click += new EventHandler(del_item);
td.Controls.Add(lb);
Alla produkter man har valt att lägga till hamnar automatioskt i en DataTable som i sin tur ligger i en Session, när kungvagnen skall visas hämtas datan från sessionen och läggs in i en "global" DataTable.
private DataTable Cart;
private void Page_Load(object sender, System.EventArgs e){
Cart = (DataTable)Session["Cart"];
// massa kod för att skapa en Table
}
Funktionen som tar bort den aktuella produkten från datatablen serut såhär:
public void del_item(object Source, EventArgs e){
int id = Convert.ToInt32(((LinkButton)Source).ID);
DataTable dt = (DataTable)Session["Cart"];
dt.Rows.RemoveAt(id);
Session["Cart"] = dt;
}
Nu till problemet:
När man klickar på en linkbutton så gör den en postback och tar bort den aktuella produkten ur datatablen och sedan uppdaterar sessionen. Problemet är bara att Sessionen laddas i Page_Load innan den uppdateras i del_item så alla produkter inklusive den man tog bort visas i kundvagnen, om man sedan uppdaterar kungvagnen manuellt så är produkten borta.
Någon som har nåt förslag på en lösning?
GladhMedlem sedan maj 20012 812 inlägg public void del_item(object Source, EventArgs e){
int id = Convert.ToInt32(((LinkButton)Source).ID);
Cart.Rows.RemoveAt(id);
Session["Cart"] = Cart;
- M
DavidBMedlem sedan jan. 20001 372 inlägg Tyvärr, det gjorde ingen större skillnad i resultatet.
Jag har dock testat en annan grej:
Jag har lagt koden som skapar min table i en egen funktion som jag kallar MakeTable()
private void MakeTable(){
// kod för att skapa tablen
}
I Page_load kör jag bara denna när sidan inte gör en postback
if(!Page.IsPostBack){
MakeTable();
}
även i del_item har jag lagt till MakeTable();
Nu visas tablen när det inte finns någon postback och när jag har gjort en postback så visas ingenting. Ändrar jag dock i min Page_load och där endast kör MakeTable så visas det min table 2 gånger efter en postback.
Borde inte MakeTable kunna köras från del_item utan att den sammtidigt körs i Page_load?
GladhMedlem sedan maj 20012 812 inlägg
Tyvärr, det gjorde ingen större skillnad i resultatet.
Det är för att du inte laddar om dina resultat efter att du tagit bort data.
Vid en postback så kommer alltid Page_Load() att köras först och sedan kommer eventet att köras, om man då binder data till sin sida i Page_Load() och förändrar datan i sitt event så måste man binda om datan i sitt event, så kalla på metoden som binder data till sidan från ditt event så kommer det att fungera.
- M
DavidBMedlem sedan jan. 20001 372 inlägg Jo jag börjar förstå detta. Nu ser koden ut ungefär såhär:
private void Page_Load(object sender, System.EventArgs e){
if(!Page.IsPostBack){
MakeTable();
}
}
private void MakeTable(){
DataTable Cart = (DataTable)Session["Cart"];
// skapar tablen utifrån datan i Cart
}
public void del_item(object Source, EventArgs e){
int id = Convert.ToInt32(((LinkButton)Source).ID);
DataTable dt = (DataTable)Session["Cart"];
dt.Rows.RemoveAt(id);
Session["Cart"] = dt;
}
För mig känns det som att detta borde fungera men vid postbacken så syns ingenting.
Ändrar jag dock Page_load så att den serut såhär:
private void Page_Load(object sender, System.EventArgs e){
MakeTable();
}
Så visas två exemplar av samma table.
Kan det vara så att kontrollerna som har "skickat" eventet inte är skapade vid postbacken och att det därför aldrig körs nåt event? HUr gör man i så fall för att lösa detta på bästa sätt?
GladhMedlem sedan maj 20012 812 inlägg Att det vid det första exemplet inte syns något är inte så konstigt då du faktiskt inte kallar på MakeTable() methoden och alltså inte skriver ut någon data till sida.
Hur du kan få 2 tabeller vid det andra exemplet är dock underligt, eftersom du endast gör en MakeTable(), det skulle var om du har en viewstate på den tabell som du skapar så fall skapar ASP.NET automatiskt den till dig igen, men då borde du se åtminstonde 1 tabel i ditt första exempel.
- M