Permalänk
Medlem

[Q] - C# Filhantering

För ett tag sedan så läste jag på lite trådar om att skriva till filer men de trådar jag lyckades hitta var inte direkt relevanta till vad jag tänker åstadkomma.
Vad jag försöker åstadkomma är att jag ska genom 7 olika textboxar lägga in värden i en text fil, problemet är att jag vill ju kunna läsa in dom igen.

Jag vill även att när jag klickar på ett listbox item så presenteras all resterande fakta i de inputfält som tidigare beskrivits. Mina planer var att använda
en "jagged array", men vet inte om det finns smidigare alternativ vore smartare..

OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "Txt files (*.txt)|*.txt"; if (ofd.ShowDialog() == DialogResult.OK) { foreach (string line in File.ReadAllLines(ofd.FileName)) { string[] parts = line.Split(','); foreach (string part in parts) { string[,] siblings = new string[,] { { }, { } }; } } }

Meningen var att jag tänkte splitta varje ord på varje rad med ett ',' och därav kunna plocka ut varje ord för sig, blanksteg skulle funka med men oavsett!
Så nu till frågan, hur kan jag utföra detta lilla "projekt". Att spara är nog inga svårigheter så länge jag får till enkelriktat först.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem

Lägg allt i en Lista av sträng arrayer.

List<string[]> my_ListWithStringsArrays = new List<string[]>(); try { using (StreamReader readFile = new StreamReader(path)) { string line; string[] _row; while ((line = readFile.ReadLine()) != null) { _row = line.Split(','); my_ListWithStringsArrays.Add(_row); } } }

Typ så skulle jag gjort. Kan testa det snart i VS2010.
EDIT: fungerar bra i VS2010, path=ditt inlästa FileName från dialogrutan.
Varje index i listan kan du visa i listboxen och när de klickar på en rad i listboxen tar du värden från listan på samma position.

Visa signatur

Lill-server(2010): SFF NAS Zotac H55ITX-C-E, Lian Li PC-Q08B, Intel Core i3 540
Stor-server(2014): SuperMicro X10SL7-F, 20GB ECC RAM, 4x2TB WD Green, E3-1230v3, 2xIntel Dual Gigabit Nic

Permalänk
Medlem
Skrivet av Docker:

Lägg allt i en Lista av sträng arrayer.

List<string[]> my_ListWithStringsArrays = new List<string[]>(); try { using (StreamReader readFile = new StreamReader(path)) { string line; string[] _row; while ((line = readFile.ReadLine()) != null) { _row = line.Split(','); my_ListWithStringsArrays.Add(_row); } } }

Typ så skulle jag gjort. Kan testa det snart i VS2010.
EDIT: fungerar bra i VS2010, path=ditt inlästa FileName från dialogrutan.
Varje index i listan kan du visa i listboxen och när de klickar på en rad i listboxen tar du värden från listan på samma position.

Nice, funkar men får inte till att loopa genom för att lägga in i textBoxarna, så här långt har jag kommit:

int indexChosen = listBox1.SelectedIndex; for (int i = 0; i < my_ListWithStringsArrays[indexChosen][indexChosen].Count(); i++) { textBox1.Text = my_ListWithStringsArrays[indexChosen][i]; textBox2.Text = my_ListWithStringsArrays[indexChosen][i]; textBox3.Text = my_ListWithStringsArrays[indexChosen][i]; textBox4.Text = my_ListWithStringsArrays[indexChosen][i]; textBox5.Text = my_ListWithStringsArrays[indexChosen][i]; textBox6.Text = my_ListWithStringsArrays[indexChosen][i]; textBox7.Text = my_ListWithStringsArrays[indexChosen][i]; }

Ser vad jag gjort fel men kan inte fixa det.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem

För att skapa en string från en samling av strings (t ex en string[]) använder du .Join(skiljesträng):

stringCollection.Join(", ");

edit: Jag kanske missförstår vad du försöker göra. Vad exakt innehåller en listbox och hur ska det innehållet föras över till textboxarna?
edit2: Jag tror jag missförstår dig mer än jag förstår. Du använder ju bara listboxens SelectedIndex-värde, inte själva värdet som är valt..

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Hedersmedlem
Skrivet av freddyfresh:

Ser vad jag gjort fel men kan inte fixa det.

Varför har du en loop?

Permalänk
Medlem
Skrivet av Elgot:

Varför har du en loop?

väldigt bra fråga, skulle vart mer logiskt om han indexerat sina textboxar på något sätt

Visa signatur

Laptop - MacBook 2.0GHz, 4GB ram, Intel GMA 950
Stationär - i5 3570k @ 4ghz, 8gb ram, 120gb ssd + 2tb hdd, Windows 8 64bit, fractal design arc
Citera så jag hittar tillbaka :)

Permalänk
Medlem

Grejen är den att jag ska ha 1 jagged array som visar upp första [0] i listboxen så man kan se den. Låt oss säga att vi har en mening: Jag, är bäst. Då ska enbart "Jag" synas i listboxen och resterande ord ligga kvar i listan och sedan när man klickar på "Jag" så loopas alla strings ut i textboxarna.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem
Skrivet av freddyfresh:

Grejen är den att jag ska ha 1 jagged array som visar upp första [0] i listboxen så man kan se den. Låt oss säga att vi har en mening: Jag, är bäst. Då ska enbart "Jag" synas i listboxen och resterande ord ligga kvar i listan och sedan när man klickar på "Jag" så loopas alla strings ut i textboxarna.

Ska varje textbox innehålla alla strängar, eller ska de få en sträng var?

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Hedersmedlem
Skrivet av freddyfresh:

Grejen är den att jag ska ha 1 jagged array som visar upp första [0] i listboxen så man kan se den. Låt oss säga att vi har en mening: Jag, är bäst. Då ska enbart "Jag" synas i listboxen och resterande ord ligga kvar i listan och sedan när man klickar på "Jag" så loopas alla strings ut i textboxarna.

Menar du inte såhär?

int indexChosen = listBox1.SelectedIndex; textBox1.Text = my_ListWithStringsArrays[indexChosen][0]; textBox2.Text = my_ListWithStringsArrays[indexChosen][1]; textBox3.Text = my_ListWithStringsArrays[indexChosen][2]; textBox4.Text = my_ListWithStringsArrays[indexChosen][3]; textBox5.Text = my_ListWithStringsArrays[indexChosen][4]; textBox6.Text = my_ListWithStringsArrays[indexChosen][5]; textBox7.Text = my_ListWithStringsArrays[indexChosen][6];

Permalänk
Medlem
Skrivet av Elgot:

Menar du inte såhär?

int indexChosen = listBox1.SelectedIndex; textBox1.Text = my_ListWithStringsArrays[indexChosen][0]; textBox2.Text = my_ListWithStringsArrays[indexChosen][1]; textBox3.Text = my_ListWithStringsArrays[indexChosen][2]; textBox4.Text = my_ListWithStringsArrays[indexChosen][3]; textBox5.Text = my_ListWithStringsArrays[indexChosen][4]; textBox6.Text = my_ListWithStringsArrays[indexChosen][5]; textBox7.Text = my_ListWithStringsArrays[indexChosen][6];

Den koden körde jag med som test men fick ta bort den när jag ville automatisera det till att programmet inte ska bry sig om en maxlängd, men kom på att eftersom det enbart kommer få plats med 7 st index så ville jag ändå loopa den

Edit: duger, men misslyckas nu printa listan med min "i samma fil" funktion, däremot i en ny funkar det.. Jag ska försöka få till: jag, gick, hem, igår, från, ica, butiken men det blir en på varje rad, innehållet i funktionen:

DialogResult dlg = MessageBox.Show("Vill du spara i en ny eller i den aktuella filen?\nNej för ny, Ja för denna.", "Obs!", MessageBoxButtons.YesNo); if (dlg == DialogResult.Yes) { try { List<string> existing = new List<string>(); foreach (Control ctrl in groupBox1.Controls) { if (ctrl is TextBox) { existing.Add(((TextBox)ctrl).Text); existing.Add(", "); } } int max = existing.Count() - 1; existing.RemoveAt(max); FileStream fs = File.Open(@activeFile, FileMode.Open, FileAccess.Write); StreamWriter sw = new StreamWriter(fs, Encoding.UTF8); foreach (string s in existing) { complete = s; } sw.Write(complete); sw.Close(); } catch (Exception) { } }

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Hedersmedlem
Skrivet av freddyfresh:

foreach (string s in existing) { complete = s; } sw.Write(complete);

Vill du inte ha sw.Write(complete); i loopen?

Permalänk
Medlem
Skrivet av Elgot:

Vill du inte ha sw.Write(complete); i loopen?

Tack, fattar misstaget nu.. men grejen är den att det funkar inte med sw.Write(s); heller. Därför provade jag det där.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Hedersmedlem
Skrivet av freddyfresh:

Tack, fattar misstaget nu.. men grejen är den att det funkar inte med sw.Write(s); heller.

Vad händer?

Permalänk
Medlem
Skrivet av Elgot:

Vad händer?

I ett resultat av write blir det:

Jag
,
går
,
hem
,
från
,
ica

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem
Skrivet av freddyfresh:

I ett resultat av write blir det ...

loopa inte, kör .Join() på hela sträng-arrayen istället

Skickades från m.sweclockers.com

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

loopa inte, kör .Join() på hela sträng-arrayen istället

Skickades från m.sweclockers.com

Skulle du kunna ge ett exempel på hur jag kan göra, allt är fixat nu förrutom att spara 7 st per rad.
Det ska se ut såhär:

--- 0, 1, 2, 3, 4, 5, 6
0: A, B, C, D, E, F, G
1: H, I, J , K, L, M, N
2: O, P, Q, R, S, T, U

Har konstruerat en kod för att redigera en specifik sträng ur listan:

private void textBox1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { my_ListWithStringsArrays[indexChosen][0] = textBox1.Text; } osv }

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Hedersmedlem
Skrivet av freddyfresh:

Skulle du kunna ge ett exempel på hur jag kan göra, allt är fixat nu förrutom att spara 7 st per rad.

Du skulle till exempel kunna skriva

DialogResult dlg = MessageBox.Show("Vill du spara i en ny eller i den aktuella filen?\nNej för ny, Ja för denna.", "Obs!", MessageBoxButtons.YesNo); if (dlg == DialogResult.Yes) { try { List<string> existing = new List<string>(); foreach (Control ctrl in groupBox1.Controls) { if (ctrl is TextBox) { existing.Add(((TextBox)ctrl).Text); //existing.Add(", "); } } // int max = existing.Count() - 1; // existing.RemoveAt(max); FileStream fs = File.Open(@activeFile, FileMode.Open, FileAccess.Write); StreamWriter sw = new StreamWriter(fs, Encoding.UTF8); string complete=""; string ss = string.Join(",", existing); //foreach (string s in existing) //{ // complete = s; // sw.Write(complete); //} sw.Write(ss); sw.Close(); } catch (Exception) { } }

Det är dock inget fel på versionen du hade tidigare heller; resultatet blir detsamma.

Permalänk
Medlem
Skrivet av Elgot:

Du skulle till exempel kunna skriva

...

Det är dock inget fel på versionen du hade tidigare heller; resultatet blir detsamma.

Tack, funkar. Dock ett enda problem kvar nu Får bara finnas 7 st på varje rad, men får inte riktigt till det :/

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem
Skrivet av Teknocide:

loopa inte, kör .Join() på hela sträng-arrayen istället

Skickades från m.sweclockers.com

Gjort som du sagt och får ett positivt resultat, perfekt faktiskt. Däremot verkar jag av någon anledning inte kunna skriva till själva filen :/ får troligen inte riktigt till loopen heller för att gå igenom varje objekt.

Kod:

FileStream fs = File.Open(@activeFile, FileMode.Open, FileAccess.ReadWrite); StreamWriter sw = new StreamWriter(fs, Encoding.UTF8); List<string> existing = new List<string>(); string completeLine = ""; string[] lista = new string[7]; foreach (Car aCar in car) { lista = aCar.list(); foreach (string s in lista) { completeLine = string.Join(",", lista); } } MessageBox.Show(completeLine); //ger positivt resultat sw.WriteLine(completeLine); //funkar inte sw.Close(); //funkar

Listan som returneras ser ut såhär:

public string[] list() { string[] aList = new string[7]; aList[0] = CarFact[0][0].ToString(); aList[1] = CarFact[0][1].ToString(); aList[2] = CarFact[0][2].ToString(); aList[3] = CarFact[0][3].ToString(); aList[4] = CarFact[0][4].ToString(); aList[5] = CarFact[0][5].ToString(); aList[6] = CarFact[0][6].ToString(); return aList; }

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem
Skrivet av freddyfresh:

Gjort som du sagt och får ett positivt resultat, perfekt faktiskt. Däremot verkar jag av någon anledning inte kunna skriva till själva filen :/ får troligen inte riktigt till loopen heller för att gå igenom varje objekt.

Kod:

FileStream fs = File.Open(@activeFile, FileMode.Open, FileAccess.ReadWrite); StreamWriter sw = new StreamWriter(fs, Encoding.UTF8); List<string> existing = new List<string>(); string completeLine = ""; string[] lista = new string[7]; foreach (Car aCar in car) { lista = aCar.list(); foreach (string s in lista) { completeLine = string.Join(",", lista); } } MessageBox.Show(completeLine); //ger positivt resultat sw.WriteLine(completeLine); //funkar inte sw.Close(); //funkar

Men du loopar ju fortfarande?!

foreach (string s in lista) { completeLine = string.Join(",", lista); }

ska vara: completeLine = stringJoin(",", lista);. Som du har det nu får du samma resultat varje gång i loopen. Du använder inte ens s till något.
Det är samma problem med hur du sparar (eller inte sparar) completeLine; eftersom du kör den ensam inuti car-foreachen så kommer den alltid ha sista bilens värde när den kommer ur loopen. Du måste spara till fil inuti loopen för att varje bils lista ska komma med.

Skrivet av freddyfresh:

Listan som returneras ser ut såhär:

public string[] list() { string[] aList = new string[7]; aList[0] = CarFact[0][0].ToString(); aList[1] = CarFact[0][1].ToString(); aList[2] = CarFact[0][2].ToString(); aList[3] = CarFact[0][3].ToString(); aList[4] = CarFact[0][4].ToString(); aList[5] = CarFact[0][5].ToString(); aList[6] = CarFact[0][6].ToString(); return aList; }

Här bör du köra en loop. Notera att aList[n] får värdet av CarFact[0][n], vilket innebär att du kan iterera från 0 till n och tilldela värdet inuti loopen.

Några andra tankar: Filen kan öppnas med FileMode.Create eftersom du antingen vill skapa filen om den inte finns, eller skriva över den gamla om den redan finns. Det blir lättare om du använder File-klassen för att göra allt i ett svep:

using (var stream = File.CreateText(file)) { // skriver över file ... kod följer }

using ser till att strömmen (och filen) stängs efter blocket är avslutat.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Men du loopar ju fortfarande?!

foreach (string s in lista) { completeLine = string.Join(",", lista); }

ska vara: completeLine = stringJoin(",", lista);. Som du har det nu får du samma resultat varje gång i loopen. Du använder inte ens s till något.
Det är samma problem med hur du sparar (eller inte sparar) completeLine; eftersom du kör den ensam inuti car-foreachen så kommer den alltid ha sista bilens värde när den kommer ur loopen. Du måste spara till fil inuti loopen för att varje bils lista ska komma med.

Här bör du köra en loop. Notera att aList[n] får värdet av CarFact[0][n], vilket innebär att du kan iterera från 0 till n och tilldela värdet inuti loopen.

Några andra tankar: Filen kan öppnas med FileMode.Create eftersom du antingen vill skapa filen om den inte finns, eller skriva över den gamla om den redan finns. Det blir lättare om du använder File-klassen för att göra allt i ett svep:

using (var stream = File.CreateText(file)) { // skriver över file ... kod följer }

using ser till att strömmen (och filen) stängs efter blocket är avslutat.

Löstes genom:

public string[] list() { string[] aList = new string[7]; for (int i = 0; i < CarFact[0].Count(); i++) { aList[i] = CarFact[0][i].ToString(); } return aList; }

FileStream fs = File.Open(@activeFile, FileMode.OpenOrCreate, FileAccess.ReadWrite); StreamWriter sw = new StreamWriter(fs, Encoding.UTF8); foreach (Car Car in car) { lista = Car.list(); completeLine = string.Join(", ", lista); sw.WriteLine(""); sw.Write(completeLine); } sw.Close(); sw = null; fs.Close();

Utskrift funkar nu men var tvungen att lägga till en tom WriteLine längst upp innan loopen att skriva, annars kolliderade den gamla med den nya.
När du sa det du sa blev det ganska uppenbart och jag hade inte tänkt på det innan. Men inte för att verka jobbig men nu har jag problemet att jag istället inte kan läsa in mer än en bil :/

Inser vad jag gjort för fel men vet inte riktigt hur jag ska lösa det...

while ((line = readFile.ReadLine()) != null) { _row = line.Split(','); my_ListWithStringsArrays.Add(_row); } my_ListWithStringsArrays.RemoveAt(0); foreach (string[] s in my_ListWithStringsArrays) { //newCar = new Car(); funkar inte newCar.InitCar(s[0], s[1], s[2], s[3], s[4], s[5], s[6]); car.Add(newCar); } listBox1.Items.Add(newCar.GetPlate());

Om man skulle använda den metoden som är kommenterad (newCar = new Car(); ) så skapas bara en av de rader som finns i filen, om inte så skapas ingen.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem
Skrivet av freddyfresh:

FileStream fs = File.Open(@activeFile, FileMode.OpenOrCreate, FileAccess.ReadWrite); StreamWriter sw = new StreamWriter(fs, Encoding.UTF8); foreach (Car Car in car) { lista = Car.list(); completeLine = string.Join(", ", lista); sw.WriteLine(""); sw.Write(completeLine); } sw.Close(); sw = null; fs.Close();

Utskrift funkar nu men var tvungen att lägga till en tom WriteLine längst upp innan loopen att skriva, annars kolliderade den gamla med den nya.

Såvida du inte vill ha en tom rad först i varje fil så blir det smidigare att helt enkelt skriva raden med sw.WriteLine(completeLine).

Skrivet av freddyfresh:

Inser vad jag gjort för fel men vet inte riktigt hur jag ska lösa det...

while ((line = readFile.ReadLine()) != null) { _row = line.Split(','); my_ListWithStringsArrays.Add(_row); } my_ListWithStringsArrays.RemoveAt(0); foreach (string[] s in my_ListWithStringsArrays) { //newCar = new Car(); funkar inte newCar.InitCar(s[0], s[1], s[2], s[3], s[4], s[5], s[6]); car.Add(newCar); } listBox1.Items.Add(newCar.GetPlate());

Om man skulle använda den metoden som är kommenterad (newCar = new Car(); ) så skapas bara en av de rader som finns i filen, om inte så skapas ingen.

Ok, vad är det som du inser är fel? Utan insikt i din Car-klass så går det inte att felsöka, men du verkar vilja initiera den med raderna i din fil.
Tänk på att du bör deklarera variablerna på samma ställe som de används, såvida de inte nödvändigtvis måste vara globalt åtkomliga i hela klassen. Exempel på problematiska variabler i din kodsnutt är newCar, line och _row, möjligtvis även my_ListWithStringsArrays. Inledande underscore brukar dessutom användas för att signifikera privata instansvariabler, men _row tilldelas och används lokalt inuti en loop. Har du lagt till det av någon särskild anledning?

Hela snutten kan kodas om till:

while ((var line = readFile.readLine()) != null) // lokal variabel som "försvinner" efter loopen { var newCar = new Car(line.Split(',')); // konstruktorn av Car tar en string[] car.Add(newCar); listBox1.Items.Add(newCar.GetPlate()); }

my_ListWithStringsArrays.RemoveAt(0); verkar bara ta bort första raden i din fil vilket är ett problem som uppkommit av din tomma sw.WriteLine(). Jag har även stoppat in listBox1.Items.Add i loopen så att varje bils registreringsnummer läggs till.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Såvida du inte vill ha en tom rad först i varje fil så blir det smidigare att helt enkelt skriva raden med sw.WriteLine(completeLine).

Ok, vad är det som du inser är fel? Utan insikt i din Car-klass så går det inte att felsöka, men du verkar vilja initiera den med raderna i din fil.
Tänk på att du bör deklarera variablerna på samma ställe som de används, såvida de inte nödvändigtvis måste vara globalt åtkomliga i hela klassen. Exempel på problematiska variabler i din kodsnutt är newCar, line och _row, möjligtvis även my_ListWithStringsArrays. Inledande underscore brukar dessutom användas för att signifikera privata instansvariabler, men _row tilldelas och används lokalt inuti en loop. Har du lagt till det av någon särskild anledning?

Hela snutten kan kodas om till:

while ((var line = readFile.readLine()) != null) // lokal variabel som "försvinner" efter loopen { var newCar = new Car(line.Split(',')); // konstruktorn av Car tar en string[] car.Add(newCar); listBox1.Items.Add(newCar.GetPlate()); }

my_ListWithStringsArrays.RemoveAt(0); verkar bara ta bort första raden i din fil vilket är ett problem som uppkommit av din tomma sw.WriteLine(). Jag har även stoppat in listBox1.Items.Add i loopen så att varje bils registreringsnummer läggs till.

Mycket av det du säger är sant, jag har insett att det var dumt att inte publicera koden i min car klass, borde förstås ha gjort det redan. Har däremot laggt upp den här på pastebin och största problemet är just att jag ska tvingas returnera specifika värden som syns här på bilden.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem
Skrivet av freddyfresh:

Mycket av det du säger är sant, jag har insett att det var dumt att inte publicera koden i min car klass, borde förstås ha gjort det redan. Har däremot laggt upp den här på pastebin och största problemet är just att jag ska tvingas returnera specifika värden som syns här på bilden.

CarFact är onödigt överkomplicerad. Den är en lista av sträng-arrays men du använder bara första positionen ([0]) så varför ens ha den?
Istället för InitCar borde du han en konstruktor. Sedan tycker jag att du kan spara bilens data i properties för att enkelt kunna komma åt dem utifrån. Något i stil med

class Car { public string Plate { get; set; } public string Modell { get; set; } ... public Car(string plate, string modell, och så vidare ... ) { Plate = plate; Modell = modell; osv ... } public string[] ToList() { var result = new string[7]; result[0] = Plate; result[1] = Modell; ... return result; } public override string ToString() { return ToList().Join(", "); } }

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

CarFact är onödigt överkomplicerad. Den är en lista av sträng-arrays men du använder bara första positionen ([0]) så varför ens ha den?
Istället för InitCar borde du han en konstruktor. Sedan tycker jag att du kan spara bilens data i properties för att enkelt kunna komma åt dem utifrån. Något i stil med

class Car { public string Plate { get; set; } public string Modell { get; set; } ... public Car(string plate, string modell, och så vidare ... ) { Plate = plate; Modell = modell; osv ... } public string[] ToList() { var result = new string[7]; result[0] = Plate; result[1] = Modell; ... return result; } public override string ToString() { return ToList().Join(", "); } }

Har igen modifierat klassen och form 1 för att fungera tillsammans. Lagring funkar perfekt men nu efter ändringen så sparas det inte på samma sätt och min loop för att läsa in värdet funkar fortfarande bara för en rad av bilinformation....
Min kod:

Spara:

FileStream fs = File.Open(@activeFile, FileMode.OpenOrCreate, FileAccess.ReadWrite); StreamWriter sw = new StreamWriter(fs, Encoding.UTF8); foreach (Car Car in car) { sw.WriteLine(Car.ToString()); }

Ladda in:

string line; string[] row; while ((line = readFile.ReadLine()) != null) { row = line.Split(','); my_ListWithStringsArrays.Add(row); } foreach (string[] s in my_ListWithStringsArrays) { Car aCar = new Car(s[0], s[1], s[2], s[3], s[4], s[5], s[6]); car.Add(aCar); } int newCar = car.Count(); listBox1.Items.Add(car[newCar].GetPlate());

Som vi ser så funkar enbart loopen för de "definierade" första 7 objekten och inte de resterande som följer 6-X där X är variabel för högsta värde.
Har däremot som vanligt ingen aning om hur jag ska lösa detta. Om detta blir löst så är programmet klart.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem

Kolla mitt förrförra svar där jag påpekar hur loopen är felaktig och ger en mer koncis lösning. Vad du menar med 6-X förstår jag tyvärr inte. Du har fortafarande ett @-tecken framför din variabel activeFile. Vet du varför?

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Kolla mitt förrförra svar där jag påpekar hur loopen är felaktig och ger en mer koncis lösning. Vad du menar med 6-X förstår jag tyvärr inte. Du har fortafarande ett @-tecken framför din variabel activeFile. Vet du varför?

@ använder jag bara för att jag upptäckt att C# brukar tolka \ som om jag skulle skriva \\ och tvingas skriva \\ annars.

Min konstruktor tar ju inte en sträng array utan den gör ju separata namn på variabler i form av en string

public Car(string plate, string modell, string type, string productionYear, string color, string length, string value) { Plate = plate; Modell = modell; Type = type; ProductionYear = productionYear; Color = color; Length = length; Value = value; }

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem
Skrivet av freddyfresh:

@ använder jag bara för att jag upptäckt att C# brukar tolka \ som om jag skulle skriva \\ och tvingas skriva \\ annars.

Min konstruktor tar ju inte en sträng array utan den gör ju separata namn på variabler i form av en string

public Car(string plate, string modell, string type, string productionYear, string color, string length, string value) { Plate = plate; Modell = modell; Type = type; ProductionYear = productionYear; Color = color; Length = length; Value = value; }

Ja antingen kan du ändra konstruktorn så den tar emot en string[] istället, vilket verkar smidigt i detta fall då du hela tiden arbetar med strängarrayer, eller så kan du skapa en konstruktor till (klasser kan ha flera konstruktorer). Dessutom kan den ena anropa den andra för att återanvända kod!

public Car(string[] data) : this(data[0], data[1], data[2]..., data[7]) { }

Om du aldrig kommer använda dig av den första är det dock meningslöst att ha två stycken. Faktum är att jag misstänker att hela klassen Car är meningslös, det verkar inte som om du använder den till någonting utanför spara-till-fil-funktionen.

Angående @-tecknet, det används när du arbetar med strängliteraler, exempelvis @"Text \ med \ backslashes". Utan at-tecknet tolkas backslash som specialtecken i strängliteraler (en strängliteral är text inom citationstecken.). Framför ett variabelnamn har @ en helt annan betydelse och du tjänar ingenting på att ha det där, det ser bara ut som om du inte vet vad du gör.

edit: du kanske är nyfiken på vad @ kan användas till framför ett variabelnamn. Det används i de fåtall fall när du är tvungen att arbeta med ett namn som är ett nyckelord i C#. Exempelvis kan du arbeta med en variabel som heter while genom att sätta @ framför:

var @while = 42;

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Ja antingen kan du ändra konstruktorn så den tar emot en string[] istället, vilket verkar smidigt i detta fall då du hela tiden arbetar med strängarrayer, eller så kan du skapa en konstruktor till (klasser kan ha flera konstruktorer). Dessutom kan den ena anropa den andra för att återanvända kod!

public Car(string[] data) : this(data[0], data[1], data[2]..., data[7]) { }

Om du aldrig kommer använda dig av den första är det dock meningslöst att ha två stycken. Faktum är att jag misstänker att hela klassen Car är meningslös, det verkar inte som om du använder den till någonting utanför spara-till-fil-funktionen.

Angående @-tecknet, det används när du arbetar med strängliteraler, exempelvis @Text \ med \ backslashes. Utan at-tecknet tolkas backslash som specialtecken i strängliteraler (en strängliteral är text inom citationstecken.). Framför ett variabelnamn har @ en helt annan betydelse och du tjänar ingenting på att ha det där, det ser bara ut som om du inte vet vad du gör.

Igen jag suger på sånt här.
edit: du kanske är nyfiken på vad @ kan användas till framför ett variabelnamn. Det används i de fåtall fall när du är tvungen att arbeta med ett namn som är ett nyckelord i C#. Exempelvis kan du arbeta med en variabel som heter while genom att sätta @ framför:

var @while = 42;

Borde inte problemet kvarstå?
Om jag läser in 4 rader (exempelvis) som har 7 olika strängar (separerade med ett komma) så måste jag ju nästan läsa in den till en jagged först och sen säga att för varje [0], [1] osv ge de 7 på [0][0-6] till Car ? För även om string[] blir inläst så måste ju den max innehålla 7 st igen.

Prövade att köra en kod mot 3 rader, den inkluderade första raden sen sket han i resten.

Visa signatur

Citera om du vill ha svar, hjälpte jag dig, gilla svaret!
AzireVPN - Felkod40

Permalänk
Medlem
Skrivet av freddyfresh:

Borde inte problemet kvarstå?
Om jag läser in 4 rader (exempelvis) som har 7 olika strängar (separerade med ett komma) så måste jag ju nästan läsa in den till en jagged först och sen säga att för varje [0], [1] osv ge de 7 på [0][0-6] till Car ? För även om string[] blir inläst så måste ju den max innehålla 7 st igen.

Prövade att köra en kod mot 3 rader, den inkluderade första raden sen sket han i resten.

Men sluta krångla till saker nu
Varför ska du ha en jagged array? En bil har en modell, ett registreringsnummer, en ägare osv. Varför försöker du spara denna information i en List<string[]>? Du använder bara den första positionen, [0], så listan är helt meningslös. Om din Car har en konstruktor som tar sju argument av typen string så är det dessutom onödigt tillkrånglat att ta dessa lösa bitar data och sedan stoppa in dem i en array, när de är både flexiblare och smidigare att spara dem i properties.

Att det bara kommer upp en bil tror jag fortfarande beror på att du har listBox1.Items.Add(...) utanför loopen.

Visa signatur

Kom-pa-TI-bilitet