Avatar billede fun22 Nybegynder
10. december 2008 - 19:15 Der er 24 kommentarer og
1 løsning

Indkøbskurv

Hej..

Jeg er ved at lave en lille shop, men er kørt fast i at tilføje vare til kurven..

Jeg kan fint tilføje en ting, men hvis tingen allered er der, skal den jo bare opdatere antallet..

Her er den kode, jeg har lavet indtil videre:

Public Sub AddItem(ByVal ID As Integer, ByVal Qty As Integer)
        Dim ShopString As String
        ShopString = System.Web.HttpContext.Current.Session("Cart")

        Dim QtyString As String
        QtyString = System.Web.HttpContext.Current.Session("Qty")

        Dim ShopArray As Array
        Dim QtyArray As Array
        Dim ItemExists As Boolean = False
        Dim tempString As String = ""

        ShopArray = ShopString.Split(",")
        QtyArray = QtyString.Split(",")

        For Each p In ShopArray
            If p = ID.ToString Then
                ItemExists = True
            End If
        Next

        If ItemExists = True Then
            For Each pp In ShopArray
                QtyString = QtyString & "," & pp
            Next
        Else
            ShopString = ShopString & "," & ID
            QtyString = QtyString & "," & Qty
        End If

        MsgBox(ShopString)
        MsgBox(QtyString)

        System.Web.HttpContext.Current.Session("Cart") = ShopString
        System.Web.HttpContext.Current.Session("Qty") = QtyString
    End Sub
Avatar billede thesurfer Nybegynder
10. december 2008 - 23:00 #1
Du koder i ASP.NET men koder som om du koder i ASP!

ASP.NET er særdeles objekt orienteret, hvorfor det vil være "forkert" at bruge strenge til det formål, som du gør der.

Jeg vil anbefale at du kigger nærmere på OOP (objekt orienteret programmering) som er en af de stærke sider ved ASP.NET.

Der findes med garanti et hav af bøger på biblioteket, som kan hjælpe dig på vej.
Avatar billede fun22 Nybegynder
10. december 2008 - 23:07 #2
okay.. Jeg fik det til at virke således:

Dim ShopString As String
        ShopString = System.Web.HttpContext.Current.Session("Cart")

        Dim QtyString As String
        QtyString = System.Web.HttpContext.Current.Session("Qty")

        Dim ShopArray As Array
        Dim QtyArray As Array
        Dim ItemExists As Boolean = False
        Dim i As Integer = -1

        ShopArray = ShopString.Split("|")
        QtyArray = QtyString.Split("|")

        For Each p In ShopArray
            i = i + 1
            If p = ID.ToString Then
                ItemExists = True
            End If
        Next

        If ItemExists = True Then
            QtyArray(i) = QtyArray(i) + Qty

            QtyString = ""

            For Each p In QtyArray
                If QtyString = "" Then
                    QtyString = p
                Else
                    QtyString = QtyString & "|" & p
                End If
            Next
        Else
            If QtyString = "" Then
                QtyString = Qty
                ShopString = ID
            Else
                QtyString = QtyString & "|" & Qty
                ShopString = ShopString & "|" & ID
            End If
        End If

        System.Web.HttpContext.Current.Session("Cart") = ShopString
        System.Web.HttpContext.Current.Session("Qty") = QtyString


Men jeg prøvet lige at kigge på det OOP du snakker om...
Avatar billede fun22 Nybegynder
10. december 2008 - 23:15 #3
Syntes ikke helt jeg kan se det med OOP...

Jeg har min kode til at ligge en en vb fil i min app_code folder, som jeg så kan tilgå på alle sider..??
Avatar billede thesurfer Nybegynder
10. december 2008 - 23:22 #4
Som med alt andet: giv dig god tid, når du vil lære om OOP.

Det er vigtigt at undgå situationer hvor man tænker "nu har jeg brugt en halv time, og jeg kan stadigvæk ikke finde ud af det, så jeg dropper det".

Jeg har nemlig selv været i din situation, hvor strings (næsten) altid var vejen frem.. Min kode indholdte altid split, til at genererer arrays.. :-)


Så mit råd: Brug tid på at lære OOP (og gerne helt fra starten), for det vil helt sikkert gøre livet nemmere for dig (det gjorde det for mig). :-)
Avatar billede fun22 Nybegynder
10. december 2008 - 23:25 #5
Okay.. nogen bøger eller artikler på nettet du kan anbefale??
Avatar billede fun22 Nybegynder
10. december 2008 - 23:26 #6
For vil helst lære det nemmeste/mest stabile..
Avatar billede arne_v Ekspert
11. december 2008 - 02:16 #7
Jeg er helt enig med thesurfer.

Din cart skal være af en type som:
  List(Of CartItem)
Avatar billede fun22 Nybegynder
11. december 2008 - 17:41 #8
Hvor kan jeg læse mere om CartItem??
Avatar billede arne_v Ekspert
11. december 2008 - 17:54 #9
Det er ikke en klasse du laeser om men en klasse du skriver !

:-)
Avatar billede fun22 Nybegynder
11. december 2008 - 18:11 #10
arh.. ja det kan jeg se nu.. Fandt denne artikel:

http://msdn.microsoft.com/en-us/library/d8b58y5d.aspx

Der er en simpelt indkøbskurv som jeg nu har modificeret til at kunne indeholde det jeg skal have...

Men jeg kan ikke umidelbart se hvordan jeg skal få det udlæst igen?!?
Avatar billede arne_v Ekspert
11. december 2008 - 19:20 #11
Jeg vil foreslaa at du starter med at have din Cart i Session og ikke i profile. Det er
simplere.
Avatar billede fun22 Nybegynder
12. december 2008 - 07:17 #12
Kan du ikke give et eksempel på en "sin egen" klasse?? Bare en simpel en.. Eller et sted hvor man kan læse om det??
Avatar billede fun22 Nybegynder
12. december 2008 - 17:15 #13
Nu har jeg lavet det sådan her:

Dim cart As New Dictionary(Of Integer, Integer)

        cart = System.Web.HttpContext.Current.Session("Cart")

        Try
            cart.Add(ItemID, Qty)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

        System.Web.HttpContext.Current.Session("Cart") = cart

Men den har problemer med at når session er tom (første gang den køres) så kommer der en fejl, fordi den vil overføre en tom session til Dictionary..

Har prøvet med at tjekke om session er = nothing, men så kommer der fejl når der er noget i session...
Avatar billede thesurfer Nybegynder
13. december 2008 - 01:39 #14
Jeg tror at du skal sammenligne sessionen med NULL i stedet for NOTHING.

Eksempel:

if System.Web.HttpContext.Current.Session("Cart") = null then

  ' der er IKKE noget i kurven

else

  ' der ER noget i kurven

end if


Det kan godt være at man skal bruge:

if System.Web.HttpContext.Current.Session("Cart") is null then
....
Avatar billede thesurfer Nybegynder
13. december 2008 - 01:41 #15
Jeg tror at teksterne skulle have været:


"' der er IKKE noget i kurven"  =  "' Sessionen har ALDRIG været deklareret"

"' der ER noget i kurven"  =  "Sessionen HAR/ER deklareret"
Avatar billede arne_v Ekspert
13. december 2008 - 01:51 #16
null hedder Nothing i VB.NET
Avatar billede arne_v Ekspert
13. december 2008 - 04:09 #17
Prøv og leg lidt med dette eksempel:

<%@ Page Language="VB" CodeFile="cartvb.vb" Inherits="E.CartPage" %>
<html>
<head>
<title>Stupid cart demo</title>
</head>
<body>
<form runat=server>
    <table border="1">
        <tr>
            <th>Name</th>
            <th>Qty</th>
        </tr>
        <asp:Repeater id="Cart" runat="server">
            <ItemTemplate>
                <tr>
                <td><%# DataBinder.Eval(Container.DataItem, "Name") %></td>
                <td><%# DataBinder.Eval(Container.DataItem, "Qty") %></td>
                </tr>
            </ItemTemplate>
        </asp:Repeater>
    </table>
<asp:Button id="AddA" text="Add A" runat="server"/>
<asp:Button id="AddB" text="Add B" runat="server"/>
<asp:Button id="AddC" text="Add C" runat="server"/>
</form>
</body>
</html>

og:

Imports System
Imports System.Collections.Generic
Imports System.Web.UI
Imports System.Web.UI.WebControls

Namespace E
    Public Class Item
        Private _name As String
        Private _qty As Integer
        Public Property Name() As String
            Get
                return _name
            End Get
            Set
                _name = Value
            End Set
        End Property
        Public Property Qty() As Integer
            Get
                return _qty
            End Get
            Set
                _qty = Value
            End Set
        End Property
    End Class
    Public Partial Class CartPage
        Inherits Page
        Public Sub Page_Load(src As Object, e As EventArgs)
            Dim lst As List(Of Item) = DirectCast(Session("Cart"), List(Of Item))
            If lst Is Nothing Then
                lst = New List(Of Item)()
                Session("Cart") = lst
            End If
            Cart.DataSource = lst
            Cart.DataBind()
        End Sub
        Protected Overloads Overrides Sub OnInit(e As EventArgs)
            MyBase.OnInit(e)
            AddHandler AddA.Click, AddressOf AddA_Click
            AddHandler AddB.Click, AddressOf AddB_Click
            AddHandler AddC.Click, AddressOf AddC_Click
        End Sub
        Public Sub AddA_Click(sender As Object, e As EventArgs)
            Add("A")
        End Sub
        Public Sub AddB_Click(sender As Object, e As EventArgs)
            Add("B")
        End Sub
        Public Sub AddC_Click(sender As Object, e As EventArgs)
            Add("C")
        End Sub
        Private Sub Add(_name As String)
            Dim lst As List(Of Item) = DirectCast(Session("Cart"), List(Of Item))
            Dim itm As Item = lst.Find(AddressOf (New Finder(_name)).Find)
            If itm IsNot Nothing Then
                itm.Qty += 1
            Else
                itm = New Item
                itm.Name = _name
                itm.Qty = 1
                lst.Add(itm)
            End If
            Cart.DataBind()
        End Sub
    End Class
    Public Class Finder
        Private name As String
        Public Sub New(ByVal _name As String)
            name = _name
        End Sub
        Public Function Find(ByVal i As Item) As Boolean
            Return i.Name = name
        End Function
    End Class
End Namespace
Avatar billede fun22 Nybegynder
13. december 2008 - 11:31 #18
Arne v - Kanont eksempel... Men hvad gør denne linie?

AddHandler AddA.Click, AddressOf AddA_Click

Den tilføjer selvfølgeli en EventHandler til knappen, så den ved hvad den skal når man klikker på den.. Men hvad hvis jeg har min knap i en repeater??
Avatar billede fun22 Nybegynder
13. december 2008 - 13:30 #19
Det fandt jeg så ud af....

Men hvad er det der sker her:

Public Class Item
        Private _name As String
        Private _qty As Integer
        Public Property Name() As String
            Get
                Return _name
            End Get
            Set(ByVal value As String)
                _name = Value
            End Set
        End Property
        Public Property Qty() As Integer
            Get
                Return _qty
            End Get
            Set(ByVal value As Integer)
                _qty = Value
            End Set
        End Property
    End Class

Hvad gør den del af koden??
Avatar billede arne_v Ekspert
13. december 2008 - 15:44 #20
Det er en klasse med 2 properties.
Avatar billede fun22 Nybegynder
14. december 2008 - 00:19 #21
Okay men hvad gør den?? Det ser jo ud som om den Henter _qty og retunere den.. Og bagefter setter den, den med en ny value??
Avatar billede arne_v Ekspert
14. december 2008 - 00:40 #22
Den gør ikke noget.

Men den kode som har en reference til en instans af Item klassen kan bruge de
propertys.

Se koden:

            If itm IsNot Nothing Then
                itm.Qty += 1
            Else
                itm = New Item
                itm.Name = _name
                itm.Qty = 1
                lst.Add(itm)
            End If
Avatar billede arne_v Ekspert
19. januar 2009 - 02:09 #23
fun22 ?
Avatar billede fun22 Nybegynder
20. januar 2009 - 16:24 #24
Ja.. øh.. det kom til at du med objekter, så smid et svar Arne..
Avatar billede arne_v Ekspert
20. januar 2009 - 21:05 #25
svar
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