Avatar billede basementjack Nybegynder
07. november 2004 - 11:17 Der er 14 kommentarer og
1 løsning

Mærkelig item-fjernelse fra HashTable

Jeg gemmer VareNummer som Key i min hashKurv (ja ja, ikke det sjove) og antal af varen i den anden del af hashKurv. removeItem bliver fodret med VareNummeret som skal fjernes.

Problemet er hvis jeg har to vare sådan har i min hashKurv:

1 , 3
2 , 4

Hvis jeg siger removeItem(1), har jeg i min hashKurv tilbage:

2 , 3

Og det er selvfølgelig ikke meningen.. :)
_______________Kode_____________________________
    Public Sub removeItem(int As Integer)
        If not HttpContext.Current.Session("Kurv") Is Nothing Then
            Dim hashKurv as new HashTable()
            hashKurv = HttpContext.Current.Session("Kurv")
            hashKurv.Remove(int)
            HttpContext.Current.Session("Kurv") = hashKurv
            If HttpContext.Current.Session("Kurv").Count < 1 Then
                HttpContext.Current.Session("Kurv") = Nothing
            End If
        End If
    End Sub
Avatar billede snepnet Nybegynder
07. november 2004 - 11:40 #1
hej basementjack.
kan du ikke vise den kode du putter varer i kurven med ?
mvh
Avatar billede basementjack Nybegynder
07. november 2004 - 11:44 #2
Jo det er denne..
____________________________
    Public Sub Page_Load
        If Request.Querystring("Add") = "yes" Then
            Dim hashKurv as new Hashtable()
            If HttpContext.Current.Session("Kurv") Is Nothing Then
                HttpContext.Current.Session("Kurv") = hashKurv
            End If
            If not Session("Kurv") Is Nothing Then
                Dim i As Integer
                hashKurv = HttpContext.Current.Session("Kurv")
                i = hashKurv(CInt(Request.Querystring("VareNr")))
                hashKurv.remove(CInt(Request.Querystring("varenr")))
                hashKurv.add(CInt(Request.Querystring("VareNr")), 1 + i)
                HttpContext.Current.Session("Kurv") = hashKurv
            End If
            Response.Redirect("style.aspx?page=Produkter&VareNr=" & Request.Querystring("VareNr"))
        Else
                      (...........)
Avatar billede burningice Nybegynder
07. november 2004 - 12:27 #3
jamen.. den har da fjernet det item hvor at varenr er nr 1. Sagde du ikke at key'en var varenummeret?
Avatar billede snepnet Nybegynder
07. november 2004 - 12:52 #4
Hej cyber :o)

basement - du har skrevet at du går fra
1 , 3
2 , 4

til
2 , 3

og uanset hvordan man vender det så bliver det et lidt mærkeligt resultat :o)

som jeg læser det ville det svare til at der er 3 stk af vare 1, og 4 stk af vare 2, og efter remove(1) er der så 3 stk af vare 2 tilbage ?!?

er du helt sikker på at det er det der sker.... det virker ret spøjst.

men den page_load du lige har sendt ser også lidt speciel ud.... hvorfår putter du noget i kurven i page_load ?
skal det ikke ske når en bruger trykker på en knap ell. ?
(hvis du har en response.redirect på de knapper man tilføjer noget med, vil du få kørt page_load 2 gange... både når du poster, og når der sidenhen redirectes... men den side du har koden på er måske ikke en der vises eller ?)

mvh
(kan du ikke bare tælle værdien under nøglen op ? istedet for at lave en remove + add ?)
Avatar billede burningice Nybegynder
07. november 2004 - 12:59 #5
ah. ja, den havde jeg ikke lige set... at der var fjernet en af varenummer 2 også
Avatar billede basementjack Nybegynder
07. november 2004 - 13:53 #6
Jeg skriver et link ud som href="?vareNr=1&Add=Yes"

Og så i page_Load checker jeg om der er en add..

Og adder den.. :)

Jeg har ingen buttons.. Kun plain links.. manuelt skrevet ud.. Så der skulle ikke være problemer med dobbelt page_load..
Avatar billede basementjack Nybegynder
07. november 2004 - 14:57 #7
Ideer?.. Har jeg ret i at det kode der skulle virke.. :p
Avatar billede basementjack Nybegynder
08. november 2004 - 16:42 #8
Jeg har kogt det ned til :
_____________________________________
Imports System
Imports System.Collections
Imports system.Web.UI.Webcontrols
Imports system.Web.UI.Htmlcontrols

Public Class hash: Inherits System.Web.UI.Page
    Public content as placeholder
    Public lbl As Label
    Public Sub Page_Load
        Dim hashKurv as new Hashtable()
        addItem(1, hashKurv)
        addItem(1, hashKurv)
        addItem(2, hashKurv)
        addItem(2, hashKurv)
        addItem(2, hashKurv)
        lbl = New Label
        lbl.text = "Først<br>1 : " & hashKurv(1) & "<br>2 : " & hashKurv(2)
        removeItem(1, hashKurv)
        lbl.text += "<br>Efter removeItem(1)<br>2 : " & hashKurv(2)
        content.controls.add(lbl)
    End Sub
    Public Sub removeItem(int As Integer, ByRef hashKurv As HashTable)
        hashKurv.Remove(int)
        If hashKurv.Count < 1 Then
            hashKurv = Nothing
        End If
    End Sub
    Public Sub addItem(int As Integer, ByRef hashKurv As HashTable)
        Dim temp As Integer
        temp = hashKurv(int)
        hashKurv.remove(int)
        hashKurv.add(int, (1 + temp))
    End Sub
End Class
_____________________________________

Giver:

Først
1 : 2
2 : 3
Efter removeItem(1)
2 : 3
Avatar billede snepnet Nybegynder
08. november 2004 - 17:15 #9
det er også nøjagtig hvad den skal give.... hvad ville du gerne have haft den til at give ?

jeg er ikke så skrap i VB, men jeg tror at du i denne situation kan nøjes med at lave din addItem sådan her :

    Public Sub addItem(ByVal int As Integer, ByRef hashKurv As Hashtable)
        hashKurv(int) = CInt(hashKurv(int)) + 1
    End Sub


mvh
Avatar billede basementjack Nybegynder
08. november 2004 - 17:42 #10
Jep.. Men når jeg overfører pricippet til min web, virker det stadig forkert.. Er ved at overføre alle pricipperne til min test nu.. Jeg vil vide hvad der er galt.. :)
Avatar billede basementjack Nybegynder
08. november 2004 - 18:45 #11
Okay.. Nu har jeg det hele plads.. Og det virker.. Bare ikke hvis det jeg sætter det ind i min kode som skal bruges..

hashtable.aspx
___________________________
<%@ Page Language="vb" Inherits="hash" Src="hashTable.vb" Trace="true" %>
<html>
<head>
</head>
<body>
    <form id="enform" runat="server">
        <asp:placeholder id="content" runat="server"></asp:placeholder><br>
        <asp:Button id="btn" OnClick="btnNy" runat="server" Text="Ny"></asp:Button>
        <asp:TextBox id="txt" runat="server"></asp:TextBox>
    </form>
</body>
</html>

hashtable.vb
____________________________________
Imports System
Imports System.Collections
Imports System.Web
Imports system.Web.UI.Webcontrols
Imports system.Web.UI.Htmlcontrols

Public Class hash: Inherits System.Web.UI.Page
    Public content as placeholder
    Public lbl As Label
    Public txt As Textbox
    Public Sub Page_Load
        If not Request.Querystring("add") Is Nothing Then
            addItem(Request.Querystring("add"), HttpContext.Current.Session("Kurv"))
            Response.Redirect("hashTable.aspx")
        End If
        If not Request.Querystring("remove") Is Nothing Then
            removeItem(Request.Querystring("remove"), HttpContext.Current.Session("Kurv"))
            Response.Redirect("hashTable.aspx")
        End If
        If HttpContext.Current.Session("Kurv") Is Nothing Then
            Dim hashKurv As new Hashtable
            addItem(1, hashKurv)
            addItem(1, hashKurv)
            addItem(2, hashKurv)
            addItem(2, hashKurv)
            addItem(2, hashKurv)
            HttpContext.Current.Session("Kurv") = hashKurv
        End If
        lbl = New Label
        lbl.Text = "Kurv"
        Dim i As integer
        Dim j As integer
        i = HttpContext.Current.Session("Kurv").Count
        Dim arKeys As Array = arKeys.CreateInstance(GetType(Integer), i)
        HttpContext.Current.Session("Kurv").Keys.CopyTo(arKeys, 0)
        For j = 0 To i-1
            lbl.Text += "<br>Vare " & arKeys(j) & " Antal " & HttpContext.Current.Session("Kurv")(arKeys(j)) & ". <a href=""?add=" & arKeys(j) & """>Tilføj</a> <a href=""?remove=" & arKeys(j) & """>Fjern</a>"
        Next j
        content.controls.add(lbl)
    End Sub
    Public Sub removeItem(int As Integer, ByRef hashKurv As HashTable)
        hashKurv.Remove(int)
        If hashKurv.Count < 1 Then
            hashKurv = Nothing
        End If
        Trace.Write("remove")
    End Sub
    Public Sub addItem(int As Integer, ByRef hashKurv As HashTable)
        Dim temp As Integer = 0
        If not hashKurv(int) Is Nothing Then
            temp = hashKurv(int)
        End If
        hashKurv.remove(int)
        hashKurv.add(int, (1 + temp))
        Trace.Write("add")
    End Sub
    Public Sub btnNy(sender As Object, e As System.EventArgs)
        addItem(CType(txt.Text, Integer), HttpContext.Current.Session("Kurv"))
        Response.Redirect("hashTable.aspx")
    End Sub
End Class
Avatar billede basementjack Nybegynder
08. november 2004 - 20:01 #12
Nu fandt jeg ud af det.. :) Det var slet ikke måden jeg tilføjer eller fjerner... Men måden jeg viste mine data på..

Det skyldtes at jeg går igennem mit Array og går igennem en Reader som åbenbart er modsat hinanden sortet.. Kan man sortere et Array præcis modsat af hvad det er, eller synkronisere et Array og en Reader på en eller anden måd?..
Avatar billede basementjack Nybegynder
08. november 2004 - 20:17 #13
Nå men.. Løst.. :) Lavede en ORDER BY tabelNøgle DESC i mit sql.. Så var det i orden. Er der nogen der vil lægge et svar?..
Avatar billede snepnet Nybegynder
09. november 2004 - 02:34 #14
tjah... du har jo selv løst det, så det er nok mest rimeligt at du napper pointene selv :o)
mvh
Avatar billede basementjack Nybegynder
09. november 2004 - 10:39 #15
Træls fejl.. :)
Og tak for point.. :D
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