Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2018-12-09, 15:59
  #13
Medlem
Citat:
Ursprungligen postat av Er1x0n
Ska göra ett försök:

Kod:
 //Du har din cartList:
            var cartList = new List<Product>();

            /*Jag vet inte hur innehållet i din csv ser ut, men jag antar
            * att varje rad representerar en product(?).
            * I så fall borde varje line då får tillbaka av din StreamReader se ut
            * ungefär som nedan: (namn,beskrivning,pris):
            */
            
            var line = "Falurut,Knäckebröd från Falun,46";

            //Som du redan vet kommer detta inte att fungera:
            //cartList.Add(line);

            //MEN

            //Detta kommer att fungera:
            // cartList.Add(new Product());
            /*Ovanstående lägger till en ny produkt i din cartList,
             * men det kommer dock inte hjälpa dig särskilt mycket
             * eftersom du vill lägga till en ny produkt som har samma
             * egenskaper som finns i variabeln "line".
            */

            //Så gör såhär:

            var lineData = line.Split(',');
            //Ovanstående returnerar en string array med följande innehåll:
            //Index 0: "Falurut"
            //Index 1: "Knäckebröd från Falun"
            //Index 2: "46"

            //Nästa steg...

            var productFromLine = new Product();
            productFromLine.Name = lineData[0];
            productFromLine.Description = lineData[1];
            productFromLine.Price = double.Parse(lineData[2]);

            //Sista steget...

            cartList.Add(productFromLine);

Det finns flera sätt att göra ovanstående mycket snyggare, men då jag gissar att du är nybörjare känns detta som en lämplig nivå att börja på.

Försöka att fylla hela din cartList med hjälp av ovanstående metod, sen i nästa steg kan vi ta och fylla din ListBox på ett snygg sätt (om du inte klurar ut det på egen hand)
tack så mycket för ditt svar, såhär ser min loadcart_click ut just nu :

Kod:
 private void LoadCart_click(object sender, EventArgs e)
        {
            using (StreamReader sr = new StreamReader(@"C:\Windows\Temp\SavedCartsheet.csv"))
            {
                string line;
                while ((line = sr.ReadLine()) != null)
                    listBox2.Items.Add(line);
                  var lineData = line.Split(',');
                var productFromLine = new Product();
                {
                    productFromLine.Name = lineData[0];
                    productFromLine.Description = lineData[1];
                    productFromLine.Price = double.Parse(lineData[2]);
                }
                cartList.Add(productFromLine);
            }
problemet är att det kraschar eller jag får detta meddelandet från :

var lineData = line.Split(',');

och det står System.NullReferenceException: 'Objektreferensen har inte angetts till en instans av ett objekt.'
Hur gör jag härifrån? och jo jag är nybörjare haha..
Citera
2018-12-09, 16:46
  #14
Medlem
Citat:
Ursprungligen postat av Roockyy
problemet är att det kraschar eller jag får detta meddelandet från :

var lineData = line.Split(',');

och det står System.NullReferenceException: 'Objektreferensen har inte angetts till en instans av ett objekt.'
Hur gör jag härifrån? och jo jag är nybörjare haha..

Det är för att du exekverar raden " var lineData = line.Split(',');" efter din while loop, och då kommer line att vara null.

Lösning:
Kod:
private void LoadCart_click(object senderEventArgs e)
        {
            List<
string[]> = new List<string[]>();
            
using (StreamReader sr = new StreamReader(@"C:\Windows\Temp\SavedCartsheet.csv"))
            {
                
string line;
                while ((
line sr.ReadLine()) != null) {
                    
listBox2.Items.Add(line);
                    
c.Add(line.Split(','));
                   }

                 
//koden nedanför måste också ändras för att det ska fungera
                
var productFromLine = new Product();
                {
                    
productFromLine.Name lineData[0];
                    
productFromLine.Description lineData[1];
                    
productFromLine.Price double.Parse(lineData[2]);
                }
                
cartList.Add(productFromLine);
            } 

Detta blir dock drygt i längden och jag skulle rekomendera att du gör såhär istället:
Kod:
private void LoadCart_click(object senderEventArgs e)
        {
           List<
Productcartlist = new List<Product>();
            
using (StreamReader sr = new StreamReader(@"C:\Windows\Temp\SavedCartsheet.csv"))
            {
                
string line;
                while ((
line sr.ReadLine()) != null) {
                    
listBox2.Items.Add(line);
                   
cartlist.Add((Product)line.Split(','));
                }
                
/*var productFromLine = new Product();
                {
                    productFromLine.Name = lineData[0];
                    productFromLine.Description = lineData[1];
                    productFromLine.Price = double.Parse(lineData[2]);
                }
                cartList.Add(productFromLine);*/
            

Citera
2018-12-09, 16:53
  #15
Medlem
Har även testat

Kod:
private void LoadCart_click(object sender, EventArgs e)
        {
                string[] lines = File.ReadAllLines(@"C:\Windows\Temp\SavedCartsheet.csv");
             foreach (string line in lines )
            {
                string[] lineData = line.Split(',');
                Product productFromLine = new Product();
                {
                    productFromLine.Name = lineData[0];
                    productFromLine.Description = lineData[1];
                    productFromLine.Price = double.Parse(lineData[2]);
                    productFromLine.amount = int.Parse(lineData[3]);

                }
                cartList.Add(productFromLine);
men det står att

System.IndexOutOfRangeException: 'Indexet låg utanför gränserna för matrisen.'
Citera
2018-12-09, 17:09
  #16
Medlem
Citat:
Ursprungligen postat av Monitor2
Det är för att du exekverar raden " var lineData = line.Split(',');" efter din while loop, och då kommer line att vara null.

Lösning:
Kod:
private void LoadCart_click(object senderEventArgs e)
        {
            List<
string[]> = new List<string[]>();
            
using (StreamReader sr = new StreamReader(@"C:\Windows\Temp\SavedCartsheet.csv"))
            {
                
string line;
                while ((
line sr.ReadLine()) != null) {
                    
listBox2.Items.Add(line);
                    
c.Add(line.Split(','));
                   }

                 
//koden nedanför måste också ändras för att det ska fungera
                
var productFromLine = new Product();
                {
                    
productFromLine.Name lineData[0];
                    
productFromLine.Description lineData[1];
                    
productFromLine.Price double.Parse(lineData[2]);
                }
                
cartList.Add(productFromLine);
            } 

Detta blir dock drygt i längden och jag skulle rekomendera att du gör såhär istället:
Kod:
private void LoadCart_click(object senderEventArgs e)
        {
           List<
Productcartlist = new List<Product>();
            
using (StreamReader sr = new StreamReader(@"C:\Windows\Temp\SavedCartsheet.csv"))
            {
                
string line;
                while ((
line sr.ReadLine()) != null) {
                    
listBox2.Items.Add(line);
                   
cartlist.Add((Product)line.Split(','));
                }
                
/*var productFromLine = new Product();
                {
                    productFromLine.Name = lineData[0];
                    productFromLine.Description = lineData[1];
                    productFromLine.Price = double.Parse(lineData[2]);
                }
                cartList.Add(productFromLine);*/
            

¨

OKej, så jag testar detta

Kod:
private void LoadCart_click(object sender, EventArgs e) 
        { 
            List<string[]> c = new List<string[]>(); 
            using (StreamReader sr = new StreamReader(@"C:\Windows\Temp\SavedCartsheet.csv")) 
            { 
                string line; 
                while ((line = sr.ReadLine()) != null) { 
                    listBox2.Items.Add(line); 
                    c.Add(line.Split(',')); 
                   } 
och det fungerar, det visas i listboxen men samma problem återstår och det är att när jag laddar listan och sedan trycker på checkout så står det fortfarande 0:- ...
Citera
2018-12-09, 17:15
  #17
Medlem
Citat:
Ursprungligen postat av Roockyy
Har även testat

Kod:
private void LoadCart_click(object sender, EventArgs e)
        {
                string[] lines = File.ReadAllLines(@"C:\Windows\Temp\SavedCartsheet.csv");
             foreach (string line in lines )
            {
                string[] lineData = line.Split(',');
                Product productFromLine = new Product();
                {
                    productFromLine.Name = lineData[0];
                    productFromLine.Description = lineData[1];
                    productFromLine.Price = double.Parse(lineData[2]);
                    productFromLine.amount = int.Parse(lineData[3]);

                }
                cartList.Add(productFromLine);
men det står att

System.IndexOutOfRangeException: 'Indexet låg utanför gränserna för matrisen.'

Har du kollat hur stor din array "lineData" blir? Det verkar som du försöker komma åt element fyra i en array som bara har tre element.
Citera
2018-12-09, 17:18
  #18
Medlem
Citat:
Ursprungligen postat av Monitor2
Har du kollat hur stor din array "lineData" blir? Det verkar som du försöker komma åt element fyra i en array som bara har tre element.
jag antar att det är i produktclassen svaret finns :

Kod:
class Product
    {
        public string Name;
        public string Description;
        public double Price;
        public int amount;
        public string Image;

och denna del är från när vi läser in produkterna i början så att säga där man väljer ur sortimentet.


Kod:
string[] lines = File.ReadAllLines("PetSheet.csv");
            products = new List<Product>();
            foreach (string line in lines)
            {
                string[] values = line.Split(',');
                Product p = new Product
                {
                    Name = values[0],
                    Description = values[1],
                    Price = double.Parse(values[2]),
                    Image = values[3].Trim()

                };
                listBox1.Items.Add(p.Name + ", " + p.Price);

                products.Add(p);
Citera
2018-12-09, 17:25
  #19
Medlem
Kan det inte ha något med att det måste indexeras i save_Cart också? för såhär ser det ut i savecart

Kod:
 private void SaveCart_click(object sender, EventArgs e)
        {
            var filename = @"C:\Windows\Temp\SavedCartsheet.csv";
            string listboxData = "";
            foreach (string str1 in listBox2.Items)
            {
                listboxData += str1 + "\n";
            }
            File.WriteAllText(filename, listboxData);
Citera
2018-12-09, 21:37
  #20
Medlem
någon där?
Citera
2018-12-10, 15:54
  #21
Medlem
Jag skulle tipsa om att lägga in utskrifter där du kollar vilka värden du adderar till sumOfAllProducts. Om det är noll eller inte så vet du i alla fall vad du kan utesluta.

(Det är ingen snygg lösning och absolut inte det bästa sättet att debugga en kod men det kan ta dig i rätt riktning och är enkelt att implementera)
Citera
2018-12-10, 16:14
  #22
Medlem
Citat:
Ursprungligen postat av fractalbob
Jag skulle tipsa om att lägga in utskrifter där du kollar vilka värden du adderar till sumOfAllProducts. Om det är noll eller inte så vet du i alla fall vad du kan utesluta.

(Det är ingen snygg lösning och absolut inte det bästa sättet att debugga en kod men det kan ta dig i rätt riktning och är enkelt att implementera)
Det är noll där, det är därför jag vill ladda cartlisten för om den laddas kommer även sumofallproducts att göra det
Citera
2019-02-02, 20:42
  #23
Medlem
En annan väg att gå är att serialisera din lista med produkter för att så de-serialisera den när du ska ladda in produkterna igen.

Se ex. Här
https://docs.microsoft.com/en-us/dot...-serialization
Citera
2019-02-23, 08:54
  #24
Medlem
Citat:
Ursprungligen postat av Roockyy
Det är noll där, det är därför jag vill ladda cartlisten för om den laddas kommer även sumofallproducts att göra det

Att spara ner "SumOfAllProducts" med carten är inte rätt sätt att göra det på.

Tänk dig scenariot att du har en rabatterad vara fram till midnatt. Någon går in och lägger in varan i vagnen och går sen därifrån. Efter midnatt kommer personen tillbaka. Ska denne då få se ett totalpris som matchar det det var när denne lade in sakerna i vagnen eller det verkliga priset?

Rent generellt gör du saker mer komplicerade än du behöver.

I ditt fall har ju produkterna inget ID, något de brukar ha i verkliga livet. Dock skulle man kunna anta att produktens index är dess ID (vilket förutsätter att du inte lägger in nya produkter mitt i listan). Gör du på det sättet skulle du kunna spara ner en enda lång kommaseparerad sträng (utan brytningar) med index. Sen när du laddar datan så hämtar du ut informationen från din produktlista med hjälp av produktens "id" dsv index.

Du lägger in \n i din CSV fil, vilket inte är en korrekt windowsbrytning. Den korrekta brytningen är \r\n, men om du vill vara säker kan du använda dig av Environement.NewLine så håller den reda på vilken variant som används i ditt system. Men skippar du brytningarna och bara lägger in korgen som en CSV (dvs Comma Separated Values) så blir det superenkelt att läsa och parsa ut det hela.


1,4,3,6,9 => parsa => hämta information från produkter => visa för användaren

Rent generell så bör du spara ner så lite som möjligt i en cart (det som visas och det som sparas behöver inte vara samma sak). Egentligen bara ett gäng produktID. Priser och rabatter ska hämtas varje gång kunden ska gå in och checka ut varorna, annars kan det bli fel.

Att serialisera något som en varukorg fungerar, men om man tänker att det alltid kommer att vara någon form av databas i grund så är serialisering INTE vägen att gå. Den tar mycket plats och ger väldigt lite mervärde i sammanhanget. Serialisering används snarare när man ska skicka data mellan system och/eller diverse APIn... och då är det i stort sett ingen utom möjligen legacy system som använder sig av XML serialisering längre. I dagsläget är det ett annat format, JSON som blivit mer eller mindre defaktostandard på hur data ska serialiseras och skickas. Kolla på Newtonsoft JSON
Citera
  • 1
  • 2

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback