problemer med postback, tror jeg nok
Jeg har følgende problemJeg har en side, som skal vise indholdet af en indkøbskurv fra en webshop. Indholdet i kurven ligger i et basket objekt, som ligger i session.
Jeg har på siden en table, som jeg så dynamisk genererer nogle rows/cells til i metoden ShowContentOfBasket alt efter hvad der ligger i basket objektet.
I slutningen af denne metode laver jeg så en Opdatér knap, som ved et klik reloader siden og dernæst ændrer i basket objektets indhold (se metoden Update_click).
Når man indtaster 0 i antallet af varer, så bliver objektet fjernet fra basket objektet, men på det tidspunkt er der jo allerede tilføjet en row i tabellen for det objekt der efterfølgende bliver fjernet.
Som naturlig (for mig i hvert fald) reaktion herpå har jeg så prøvet at kalde ShowContentOfBasket fra Update_click efter at opdateringer er blevet udført. Men det medfører noget lidt underligt. Nemlig at Opdatér knappen bliver lavet 2 gange, og derefter kun virker hver anden gang man trykker på den. I HTML koden sker der også en lille forskel,
<tr><td></td><td></td><td></td><td></td><td class="ws_searchres_cell_updatebtn"><input type="submit" name="_ctl0" value="Opdatér" /></td></tr>
Og
<tr><td></td><td></td><td></td><td></td><td class="ws_searchres_cell_updatebtn"><input type="submit" name="_ctl1" value="Opdatér" /></td></tr>
Som det ses ændres name på knappen, og når name er _ctl1 så bliver update_click ikke udført.
Er der nogen der kan forklare mig hvad det er jeg gør forkert?
(her kommer koden så):
private void Page_Load(object sender, System.EventArgs e) {
ShowContentOfBasket();
VisSamletOrdreOversigt();
}
/// <summary>
/// tager det samlede beløb for varerne i basket og udfylder tblUdregning
/// med respektive data
/// </summary>
private void VisSamletOrdreOversigt() {
Session["samletpris"] = 0D;
int tmpi = tblBasket.Rows.Count -2; // 2 fordi den sidste row i tabellen er den der indeholder update knappen
for (int i = 0; i <= tmpi; i++) {
Session["samletpris"] = Double.Parse(tblBasket.Rows[i].Cells[3].Text) * Double.Parse(((TextBox)tblBasket.Rows[i].Cells[4].Controls[0]).Text) + (double)Session["samletpris"];
}
tblUdregning.Rows.Add(new TableRow());
tblUdregning.Rows[0].Cells.Add(new TableCell());
tblUdregning.Rows[0].Cells[0].CssClass = "ws_basket_cell_pris1";
tblUdregning.Rows[0].Cells[0].Text = "Samlet pris excl. moms";
tblUdregning.Rows[0].Cells.Add(new TableCell());
tblUdregning.Rows[0].Cells[1].CssClass = "ws_basket_cell_pris2";
tblUdregning.Rows[0].Cells[1].Text = Session["samletpris"].ToString();
}
/// <summary>
/// viser indholdet af basket containeren i en tabel med mulighed for at ændre antallet
/// af hver enkelt vare (1 vare af gangen)
/// udregner samtidig den samlede pris i session["samletpris"]
/// </summary>
private void ShowContentOfBasket() {
WebshopLocal.Classes.Basket basket = ((WebshopLocal.Classes.Basket)Session["basket"]);
int j = 0;
tblBasket.Rows.Clear();
foreach (WebshopLocal.Classes.Vare objVare in basket) {
tblBasket.Rows.Add(new TableRow());
// tilføj celle med articleno
tblBasket.Rows[j].Cells.Add(new TableCell());
tblBasket.Rows[j].Cells[0].CssClass = "ws_searchres_cell_artno";
tblBasket.Rows[j].Cells[0].Text = objVare.ArticleNo.ToString();
// tilføj celle med descshort
tblBasket.Rows[j].Cells.Add(new TableCell());
tblBasket.Rows[j].Cells[1].CssClass = "ws_searchres_cell_descshor";
tblBasket.Rows[j].Cells[1].Text = objVare.DescShort.ToString();
// tilføj celle med producent
tblBasket.Rows[j].Cells.Add(new TableCell());
tblBasket.Rows[j].Cells[2].CssClass = "ws_searchres_cell_prod";
tblBasket.Rows[j].Cells[2].Text = objVare.Manufacturer.ToString();
// tilføj celle med pris
tblBasket.Rows[j].Cells.Add(new TableCell());
tblBasket.Rows[j].Cells[3].CssClass = "ws_searchres_cell_pris";
tblBasket.Rows[j].Cells[3].Text = objVare.Price.ToString();
// tilføj celle med indtastningsfelt til antal
tblBasket.Rows[j].Cells.Add(new TableCell());
tblBasket.Rows[j].Cells[4].CssClass = "ws_searchres_antal";
TextBox txtAntal = new TextBox();
txtAntal.CssClass = "ws_searchres_txtantal";
txtAntal.Text = objVare.Antal.ToString();
txtAntal.ID = "txt" + objVare.ArticleNo.ToString();
tblBasket.Rows[j].Cells[4].Controls.Add(txtAntal);
j++;
}
//den sidste row med opdater knappen
TableRow tr = new TableRow();
//tomme celler så knappen står under 'antal' feltet
tr.Cells.Add(new TableCell());
tr.Cells.Add(new TableCell());
tr.Cells.Add(new TableCell());
tr.Cells.Add(new TableCell());
TableCell tc = new TableCell();
tc.CssClass = "ws_searchres_cell_updatebtn";
Button btnUpdate = new Button();
btnUpdate.Text = "Opdatér";
btnUpdate.Click += new System.EventHandler(this.update_click);
tc.Controls.Add(btnUpdate);
tr.Cells.Add(tc);
tblBasket.Rows.Add(tr);
}
/// <summary>
/// løber hele tblBasket igennem og opdaterer hver vare i objBasket med det angivne antal
/// Er det nye antal angivet til at være ugyldigt (a-x eller whatever) så sættes antal til 1
/// Er det nye antal angivet til at være 0 eller mindre så fjernes varen fra kurven
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void update_click(object sender, System.EventArgs e) {
int antal = 0;
int articleno = 0;
WebshopLocal.Classes.Basket basket = ((WebshopLocal.Classes.Basket)Session["basket"]);
for (int j = 0; j <= tblBasket.Rows.Count -2; j++) { //-2 fordi den sidste row indeholder update knappen og ikke en vare
articleno = int.Parse(tblBasket.Rows[j].Cells[0].Text);
try {
antal = int.Parse(((TextBox)tblBasket.Rows[j].Cells[4].Controls[0]).Text);
} catch (Exception ex) {
antal = 1;
}
//find varen i basket og opdatér antal, fjern evt. varen hvis antal <= 0
int i = 0;
bool found = false;
while (!found && i <= basket.Count -1) {
if (basket.Item(i).ArticleNo == articleno) {
if (antal <= 0) {
basket.remove(basket.Item(i));
} else {
basket.Item(i).Antal = antal;
}
found = true;
} else {
i++;
}
}
}
//ShowContentOfBasket();
VisSamletOrdreOversigt();
}
(håber ikke det er for uoverskueligt at læse)