webForumDet fria alternativet

Översätta från vb.net till c#

.NET

8 svar · 405 visningar · startad av MagnusJ

Medlem sedan apr. 2004150 inlägg
Frågan#1

Tjena,

Jag har följt den här guiden till hur man göra en kundvagn: http://www.sitepoint.com/article/net-shopping-cart-datatables men den är skriven i vb.net och jag håller på med c#. Så nu har jag försökt översätta det hela, men har stött på lite problem. Jag har använt mig av en generator som jag hittade på en hemsida.

Jag funderar lite över hur den här koden blev genererad:

        foreach (int objDR in objDT.Rows)
        {
            if (objDR["Product"] == Product)
            {
                objDR["Quantity"] += txtQuantity.Text;
                blnMatch = true;
                goto exitForStatement0;
            }
        }
    exitForStatement0: ;
        if (!(blnMatch))
        {
            objDR = objDT.NewRow();
            objDR["Quantity"] = txtQuantity.Text;
            objDR["Product"] = ddlProducts.SelectedItem.Text;
            objDR["Cost"] = decimal.Parse(ddlProducts.SelectedItem.Value);
            objDT.Rows.Add(objDR);
        }

Generatorn la till gotoExitForStatement0 och det. Behövs det för att kunna köra foreach-satsen? Det är även två fel där som jag inte lyckades lösa.

Det är det här:

 if (objDR["Product"] == Product)
 
objDR["Quantity"] += txtQuantity.Text;

Där felmeddelandet är Cannot apply indexing with [] to an expression of type 'int'.

Det sista felet är:

decRunningTotal += (objDR["Cost"] * objDR["Quantity"]);

Felmeddelandet:
Operator '*' cannot be applied to operands of type 'object' and 'object'

Vet någon hur man kan lösa det här?

edit: löste första felet så jag tog bort det.

Medlem sedan sep. 2006867 inlägg
#2

Jo, när du skapar objDT så får den typen "object" vilket är C# sätt att tala om att man inte vet vilken typ man fått, så du måste göra en cast, och det gör man enklast genom att skriva

objDT = (System.Data.DataTable)Session["Cart"];

och på motsvarande ställen där du får problem med typen object

De andra problemen kanske också löser sig?

Medlem sedan dec. 19996 522 inlägg
#3

Är decRunningTotal en itn isf.

(int.parse(objDR["Cost"].ToString()) * int.parse(objDR["Quantity"].ToString()));

Det är ju en datarow-object så du måste casta när du gör operationer

Medlem sedan sep. 2006867 inlägg
#4

MagnusJ skrev:

foreach (int objDR in objDT.Rows)

Där felmeddelandet är Cannot apply indexing with [] to an expression of type 'int'.

en int är en int och int[] är en vektor så för att kunna indexera så måste du skriva

foreach (int[] objDR in objDT.Rows)

....tror jag :) Är inte en stjärna på C# ännu!

Medlem sedan dec. 19996 721 inlägg
#5

Eftersom objDT är en DataTable så är det

foreach(DataRow objDR in objDT.Rows)

Goto-satsen ska du ersätta med "break"

Medlem sedan apr. 2004150 inlägg
#6

headbug skrev:

Jo, när du skapar objDT så får den typen "object" vilket är C# sätt att tala om att man inte vet vilken typ man fått, så du måste göra en cast, och det gör man enklast genom att skriva

objDT = (System.Data.DataTable)Session["Cart"];

och på motsvarande ställen där du får problem med typen object

De andra problemen kanske också löser sig?

Aha okej, jag löste det genom att skriva objDT = Session["Cart"] as DataTable; Vilket sätt är bäst?

Tack för hjälpen, nu har jag fått bort alla felmeddelanden från koden.

Nu får jag dock ett problem med en annan grej.

När jag försöker lägga till en sak i kundvagen får jag problem med den här koden:
objDR["Cost"] = decimal.Parse(ddlProducts.SelectedItem.Value);
Input string was not in a correct format.

Hur får man till det?

Edit: jag provade att byta ut den där strängen mot en fast summa bara för att se om resten fungerade. Allting fungerar förutom en grej, det är när man lägger till en produkt som man redan har så utökas det så här
Om jag har en socka i kundvagnen och lägger till en socka så blir det inte 1+1 =2 utan det blir 11.

Medlem sedan sep. 200278 inlägg
#7

Orkar inte läsa igenom allt, men jag tänkte kommentera sättet att casta objekt.

objDT = (DataTable)Session["Cart"] kastar ett fel om objektet INTE är DataTable.

objDT = Session["Cart"] as DataTable är bättre eftersom objDT kommer bli null om sessionvariabeln inte är DataTable.

is är ett annat bra keyword när man jobbar med sessionsvariabler. if (Session["Cart"] is DataTable) { objDT = Session["Cart"] as DataTable; }

Bara en kommentar ;)

Medlem sedan apr. 2004150 inlägg
#8

Aha, finns det något bra sätt att kolla om en Session är null? Nu kör jag if(Session["Cart"] == null) finns det något bättre som man ska använda när det gäller sessions?

Medlem sedan dec. 20014 239 inlägg
#9

Kanske

if(String.IsNullOrEmpty(Session["Cart"]))
254 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)