166 messaggi dal 09 febbraio 2017
Buongiorno a tutti,
ho quasi ultimato il mio "carrello" e sono bloccato nel implementare la possibilità di fare delete di una singola riga (un prodotto) o poterne modificare la quantità.

HTML
 <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" Height="278px"
                Width="540px" BackColor="Aqua" ShowFooter="True" >
            <Columns>
                    <asp:TemplateField>
        <ItemTemplate>
            <asp:CheckBox ID="CheckBox1" runat="server" />
        </ItemTemplate>
    </asp:TemplateField>
            <asp:BoundField DataField="Id" HeaderText="Id" ItemStyle-Width="50" >
<ItemStyle Width="50px"></ItemStyle>
                </asp:BoundField>
            <asp:BoundField DataField="NomeProdotto" HeaderText="Nome" ItemStyle-Width="150" >
<ItemStyle Width="150px"></ItemStyle>
                </asp:BoundField>
            <asp:BoundField DataField="PrezzoProdotto" HeaderText="PrezzoProdotto" 
                    ItemStyle-Width="150" DataFormatString="{0:N2}" ItemStyle-HorizontalAlign="Right" >
<ItemStyle Width="150px"></ItemStyle>
                </asp:BoundField>
            <asp:BoundField DataField="Quantità" HeaderText="Quantità" ItemStyle-Width="150" >
<ItemStyle Width="150px"></ItemStyle>
                </asp:BoundField>
        </Columns>
    </asp:GridView>


VB

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        ' Al load nasconde tutto il pannello contenente i dati richiesti al utente per la conferma ordine + spedizione.
        Panel1.Visible = False

        ' Fix creava doppioni al inserimento di nuovi item
        If Not Me.IsPostBack Then
            Me.BindGrid()
        End If
        ' Ok

        ' Label che mostra il totale
        Label2.Text = GridView1.FooterRow.Cells(2).Text
        ' Totale spesa in session 
        Session("vartotspesa") = Label2.Text
        ' Oppure direttamente ...
        Session("ValoreCarrello") = GridView1.FooterRow.Cells(2).Text



    End Sub

    Protected Sub BindGrid()

        Dim constr As String = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
        Dim con As New SqlConnection()
        con.ConnectionString = constr
        con.Open()
        ' Query SQL 
        Using cmd As New SqlCommand("SELECT Id,NomeProdotto,PrezzoProdotto,Quantità FROM aProdotti WHERE ID=" & Request.QueryString("ID").ToString & "", con)
            Using sda As New SqlDataAdapter(cmd)
                Dim dt As New DataTable()
                sda.Fill(dt)
                Dim SessionDt As New DataTable()
                SessionDt = Session("dt")

                If Not SessionDt Is Nothing Then

                    If (dt.Rows.Count > 0) Then
                        Dim dr As DataRow
                        dr = SessionDt.NewRow()
                        dr("Id") = dt.Rows(0)("Id").ToString()
                        dr("NomeProdotto") = dt.Rows(0)("NomeProdotto").ToString
                        dr("PrezzoProdotto") = dt.Rows(0)("PrezzoProdotto").ToString
                        dr("Quantità") = dt.Rows(0)("Quantità").ToString
                        SessionDt.Rows.Add(dr)

                    End If

                    Session("dt") = SessionDt
                    GridView1.DataSource = SessionDt
                    GridView1.DataBind()
                    'Calcola la somma e la mostra nel footer row
                    Dim total As Decimal = SessionDt.AsEnumerable().Sum(Function(row) row.Field(Of Decimal)("PrezzoProdotto"))
                    GridView1.FooterRow.Cells(1).Text = "Totale :"
                    GridView1.FooterRow.Cells(1).HorizontalAlign = HorizontalAlign.Right
                    GridView1.FooterRow.Cells(2).Text = total.ToString("N2")
                    GridView1.FooterRow.BackColor = Drawing.Color.LightYellow
                    GridView1.FooterRow.BorderStyle = BorderStyle.Solid

                Else
                    Session("dt") = dt
                    GridView1.DataSource = dt
                    GridView1.DataBind()
                    'Calcola la somma e la mostra nel footer row
                    Dim total As Decimal = dt.AsEnumerable().Sum(Function(row) row.Field(Of Decimal)("PrezzoProdotto"))
                    GridView1.FooterRow.Cells(1).Text = "Totale :"
                    GridView1.FooterRow.Cells(1).HorizontalAlign = HorizontalAlign.Right
                    GridView1.FooterRow.Cells(2).Text = total.ToString("N2")
                    GridView1.FooterRow.BackColor = Drawing.Color.LightYellow
                    GridView1.FooterRow.BorderStyle = BorderStyle.Solid

                End If
            End Using
        End Using
    End Sub



Ho provato a implementare questo , adattando anche l' html ma non mi funzionava, il problema credo sia dovuto al lanciarsi del metodo bind grid e non ri effettua correttamente la ri popolazione della table e grid view.
Non riesco a venirne fuori.


    'Protected Sub OnRowEditing(sender As Object, e As GridViewEditEventArgs)
    '    GridView1.EditIndex = e.NewEditIndex
    '    Me.BindGrid()
    'End Sub

    'Protected Sub OnUpdate(sender As Object, e As EventArgs)
    '    Dim row As GridViewRow = TryCast(TryCast(sender, LinkButton).NamingContainer, GridViewRow)
    '    Dim ID As String = TryCast(row.Cells(1).Controls(0), TextBox).Text
    '    Dim NomeProdotto As String = TryCast(row.Cells(2).Controls(0), TextBox).Text
    '    Dim PrezzoProdotto As String = TryCast(row.Cells(3).Controls(0), TextBox).Text
    '    Dim Quantità As String = TryCast(row.Cells(4).Controls(0), TextBox).Text
    '    Dim dt As DataTable = TryCast(ViewState("dt"), DataTable)
    '    dt.Rows(row.RowIndex)("ID") = ID
    '    dt.Rows(row.RowIndex)("NomeProdotto") = NomeProdotto
    '    dt.Rows(row.RowIndex)("PrezzoProdotto") = PrezzoProdotto
    '    dt.Rows(row.RowIndex)("Nome") = Quantità
    '    ViewState("dt") = dt
    '    GridView1.EditIndex = -1
    '    Me.BindGrid()
    'End Sub

    'Protected Sub OnCancel(sender As Object, e As EventArgs)
    '    GridView1.EditIndex = -1
    '    Me.BindGrid()
    'End Sub



Ho provato anche con altre tutorial , materiale dal web ma non riesco proprio ad adattare il mio progetto a questa implementazione.

Grazie a tutti in anticipo

Emanuel Pirovano
Web Developer
Ciao,
il framework ti aiuta con dei controlli già pronti ma ciò non toglie che tu possa implementare tutto a diversi livelli.
Qualche consiglio:
1. inserisci nell'aspx la colonna TemplateField con ImageButton per l'eliminazione della riga oppure TemplateField con il TextBox per l'inserimento della quantità
2. I controlli come i bottoni, in uno scenario di databinding come quello della griglia, possono includere dei "Command" con diversi Name e Argument ed essere intercettati sull'evento OnRowCommand. Questo può aiutarti in maniera più completa rispetto ai classici OnRowDeleted, OnRowDeleting e simili
3. Evita di inserire un DataTable in sessione

Ormai programmano tutti... ma la professionalità appartiene a pochi
166 messaggi dal 09 febbraio 2017
Ora riprovo, grazie mille per i consigli.

Mi sembrava la migliore soluzione per implementare un carrello, data table in sessione

Emanuel Pirovano
Web Developer
Solo come ultima strada. Dobbiamo sempre portare gli scenari al limite: se inserissi 1 mln di righe, cosa succederebbe? Probabilmente ti è sufficiente solo l'identificativo del prodotto e la quantità ma, mi è parso di capire che non sia questo il tuo problema principale.

Ormai programmano tutti... ma la professionalità appartiene a pochi
166 messaggi dal 09 febbraio 2017
Innanzitutto per contestualizzare, questa web application non è una produzione ma bensì una cosa più o meno complessa che sto facendo per imparare asp net e fare qualcosa anche di "avanzato".
Inizialmente salvavo il carrello su database, come poi sposto al archivio ordini.
Ma in un caso reale, riempirei tonnellate di database se per ogni carrello scrivo dati su questa struttura, anche vedendo le altre soluzioni postate in rete , usano quasi tutti data table o oggetti legati a sessioni .

Emanuel Pirovano
Web Developer
Confermo il fatto di non memorizzare il carrello su database. Magari in sessione puoi memorizzare solo le chiavi dei prodotti e la quantità (e/o il prezzo se soggetto a cambiamenti).

Ormai programmano tutti... ma la professionalità appartiene a pochi

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.