Avatar billede roth Nybegynder
13. februar 2004 - 14:55 Der er 1 kommentar og
1 løsning

problemer med postback, tror jeg nok

Jeg har følgende problem
Jeg 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)
Avatar billede roth Nybegynder
16. februar 2004 - 09:08 #1
*bump*
smider gerne flere points hvis det er nødvendigt
Avatar billede roth Nybegynder
16. februar 2004 - 15:25 #2
glem det, har smidt en knap på formen i design mode i stedet for at generere den dynamisk og vupti så spiller det. Godt jeg ikke brugte lang tid på at debugge før jeg prøvede det..eller noget
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester