Permalänk

AdressBok Windows Form

Hej jag behöver hjälp med uppgiften. Kopierar min fråga från engelsk forum så ni kan svara på svenska. Tack

I'm working in Windows Form and I have 6 textboxes

When selecting a contact from the list, the text boxes do not reflect the selection.

I have code like this:

Person person = (Person)listBox1.SelectedItem; textBox1.Text = person.Name; textBox2.Text = person.Gatu; textBox3.Text = person.Postnr; textBox4.Text = person.Postort; textBox5.Text = person.Telefon; textBox6.Text = person.Email;

but I'm getting the error;

System.InvalidCastException: "Unable to cast object of type 'System.String' to type 'AdressBook_2.Person'."

How to remove selected item from txt file.

How to save new value in txt file of selected item example if I want to change email of one user?

namespace AdressBook_2 { public partial class Form1 : Form { public string path = @C:\temp\AdressBok.txt; public Form1() { InitializeComponent(); } private void Avslutaknap_Click(object sender, EventArgs e) { //Stänger ner programmet this.Close(); } private void Rensaknap_Click(object sender, EventArgs e) { //Rensar listBox listBox1.Items.Clear(); } public void Form1_Load(object sender, EventArgs e) { //Ändrad FormBorderStyle till FixedSingle så att man kan inte ändra storleken //samt MaximizeBox to False //Skapar txt fillen var file = @C:\temp\AdressBok.txt; if (!File.Exists(file)) File.Create(file); } private void Registeraknap_Click(object sender, EventArgs e) { Person person = new Person(textBox1.Text, textBox2.Text, textBox3.Text, textBox4.Text, textBox5.Text, textBox6.Text); //Om Register metoden går genom då rensas alla rutor if (person.Register()) { //Rensar textbox efter man har tryck register kanpen textBox1.Clear(); textBox2.Clear(); textBox3.Clear(); textBox4.Clear(); textBox5.Clear(); textBox6.Clear(); listBox1.Items.Add(person.Name); } } private void Ladda_uppknap_Click(object sender, EventArgs e) { listBox1.Items.Clear(); File.ReadAllText(path); string line; using (StreamReader reader = new StreamReader(path)) { while ((line = reader.ReadLine()) != null) { listBox1.Items.Add(line); } } } private void Sökknap_Click(object sender, EventArgs e) { //Tömmer tidigare sökresultat listBox1.Items.Clear(); string sök = textBox7.Text; string name; using (StreamReader reader = new StreamReader(path)) { while ((name = reader.ReadLine()) != null) { if (name.Contains(sök)) { listBox1.Items.Add(name); } } } } private void Ta_bortknap_Click(object sender, EventArgs e) { } private void Sparaknap_Click(object sender, EventArgs e) { using (StreamWriter writer = new StreamWriter(path)) { } } private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { } } }

namespace AdressBook_2 { public class Person { public string Name { get; set; } public string Gatu { get; set; } public string Postnr { get; set; } public string Postort { get; set; } public string Telefon { get; set; } public string Email { get; set; } public Person(string name, string gatu, string postnr, string postort, string telefon, string email) { Name = name; Gatu = gatu; Postnr = postnr; Postort = postort; Telefon = telefon; Email = email; } public Person() { } public bool Register() { string file = @C:\temp\AdressBok.txt; using (StreamWriter _writer = new StreamWriter(file, true)) { //Metoden kollar om email är rätt inskriven då registeras if (CheckEmail()) { string row = $"{Name}, {Gatu}, {Postnr}, {Postort}, {Telefon}, {Email}"; _writer.WriteLine(row); return true; } else return false; } } public bool CheckEmail() { //Kollar up om email innehåller @ och (punkt) if (Email.Contains('@') && Email.Contains('.')) { return true; } else { MessageBox.Show("Saknas @ eller punkttecken"); return false; } } } }

Permalänk
Medlem
Skrivet av atombari22:

Person person = (Person)listBox1.SelectedItem;

but I'm getting the error;

System.InvalidCastException: "Unable to cast object of type 'System.String' to type 'AdressBook_2.Person'."

private void Registeraknap_Click(object sender, EventArgs e) { Person person = new Person(textBox1.Text, textBox2.Text, textBox3.Text, textBox4.Text, textBox5.Text, textBox6.Text); //Om Register metoden går genom då rensas alla rutor if (person.Register()) { //Rensar textbox efter man har tryck register kanpen textBox1.Clear(); textBox2.Clear(); textBox3.Clear(); textBox4.Clear(); textBox5.Clear(); textBox6.Clear(); listBox1.Items.Add(person.Name); } }

Du lägger till personens namn i listbox1, men när du läser ut SelectedItem så försöker du att casta det till ett person-objekt. Det går förstås inte att casta en sträng (namnet) till en person. Lägg till personen i listan i stället och konfigurera listan så att det är namnet som visas.

Skärmdumpen och koden tycks inte vara synkade. Din exempeldata i skärmdumpen lämnar en del att önska. Edit: Ah, du lägger till saker i listan på typ tre olika ställen, på olika sätt...

Permalänk
Medlem
Skrivet av atombari22:

Hej jag behöver hjälp med uppgiften. Kopierar min fråga från engelsk forum så ni kan svara på svenska. Tack

I'm working in Windows Form and I have 6 textboxes <Uppladdad bildlänk>

When selecting a contact from the list, the text boxes do not reflect the selection.

I have code like this:

Person person = (Person)listBox1.SelectedItem; textBox1.Text = person.Name; textBox2.Text = person.Gatu; textBox3.Text = person.Postnr; textBox4.Text = person.Postort; textBox5.Text = person.Telefon; textBox6.Text = person.Email;

but I'm getting the error;

System.InvalidCastException: "Unable to cast object of type 'System.String' to type 'AdressBook_2.Person'."

How to remove selected item from txt file.

How to save new value in txt file of selected item example if I want to change email of one user?

namespace AdressBook_2 { public partial class Form1 : Form { public string path = @C:\temp\AdressBok.txt; public Form1() { InitializeComponent(); } private void Avslutaknap_Click(object sender, EventArgs e) { //Stänger ner programmet this.Close(); } private void Rensaknap_Click(object sender, EventArgs e) { //Rensar listBox listBox1.Items.Clear(); } public void Form1_Load(object sender, EventArgs e) { //Ändrad FormBorderStyle till FixedSingle så att man kan inte ändra storleken //samt MaximizeBox to False //Skapar txt fillen var file = @C:\temp\AdressBok.txt; if (!File.Exists(file)) File.Create(file); } private void Registeraknap_Click(object sender, EventArgs e) { Person person = new Person(textBox1.Text, textBox2.Text, textBox3.Text, textBox4.Text, textBox5.Text, textBox6.Text); //Om Register metoden går genom då rensas alla rutor if (person.Register()) { //Rensar textbox efter man har tryck register kanpen textBox1.Clear(); textBox2.Clear(); textBox3.Clear(); textBox4.Clear(); textBox5.Clear(); textBox6.Clear(); listBox1.Items.Add(person.Name); } } private void Ladda_uppknap_Click(object sender, EventArgs e) { listBox1.Items.Clear(); File.ReadAllText(path); string line; using (StreamReader reader = new StreamReader(path)) { while ((line = reader.ReadLine()) != null) { listBox1.Items.Add(line); } } } private void Sökknap_Click(object sender, EventArgs e) { //Tömmer tidigare sökresultat listBox1.Items.Clear(); string sök = textBox7.Text; string name; using (StreamReader reader = new StreamReader(path)) { while ((name = reader.ReadLine()) != null) { if (name.Contains(sök)) { listBox1.Items.Add(name); } } } } private void Ta_bortknap_Click(object sender, EventArgs e) { } private void Sparaknap_Click(object sender, EventArgs e) { using (StreamWriter writer = new StreamWriter(path)) { } } private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { } } }

namespace AdressBook_2 { public class Person { public string Name { get; set; } public string Gatu { get; set; } public string Postnr { get; set; } public string Postort { get; set; } public string Telefon { get; set; } public string Email { get; set; } public Person(string name, string gatu, string postnr, string postort, string telefon, string email) { Name = name; Gatu = gatu; Postnr = postnr; Postort = postort; Telefon = telefon; Email = email; } public Person() { } public bool Register() { string file = @C:\temp\AdressBok.txt; using (StreamWriter _writer = new StreamWriter(file, true)) { //Metoden kollar om email är rätt inskriven då registeras if (CheckEmail()) { string row = $"{Name}, {Gatu}, {Postnr}, {Postort}, {Telefon}, {Email}"; _writer.WriteLine(row); return true; } else return false; } } public bool CheckEmail() { //Kollar up om email innehåller @ och (punkt) if (Email.Contains('@') && Email.Contains('.')) { return true; } else { MessageBox.Show("Saknas @ eller punkttecken"); return false; } } } }

Precis som KHAD säger så har du bara en STRING i listan, inte själva objektet. Du vill göra typ en List<Person> Persons = new();

Sen fylla på listan med personers. Sätta den som datasource för din Listview.

Se:

https://creativelycode.com/posts/data-binding-ui-controls-to-...

// Lazze

Permalänk

Jag har pluggat programmering i 2 veckor tyvärr jag kan inte allt försöker att lära mig.

Hur ska jag lägga personen i listan ? för att det ska fungera? vart ska jag skriva det?

Och hur kan jag t.ex radera en kontakt från txt filen?
och hur kan jag ändra kontakten som är sparat i txt filen?

Permalänk
Medlem
Skrivet av atombari22:

Jag har pluggat programmering i 2 veckor tyvärr jag kan inte allt försöker att lära mig.

Hur ska jag lägga personen i listan ? för att det ska fungera? vart ska jag skriva det?

Och hur kan jag t.ex radera en kontakt från txt filen?
och hur kan jag ändra kontakten som är sparat i txt filen?

Google är din vän - du får kolla exempelkod o testa saker. Youtube har mkt material för nybörjar kodaren

Här är ett exempel

https://www.c-sharpcorner.com/blogs/c-sharp-import-text-files...

Men det finns många. Microsofts egen dokumentation är ofta mkt bra

https://learn.microsoft.com/en-us/dotnet/csharp/

// LZ

Permalänk

Tack för hjälpen. Nu har jag fastand med SelectedIndexChnage jag får error

"System.InvalidCastException: „Unable to cast object of type 'System.String' to type 'AdressBook_2.Person'.”

private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { Person person = (Person)listBox1.SelectedItem; textBox1.Text = person.Name; textBox2.Text = person.Gatu; textBox3.Text = person.Postnr; textBox4.Text = person.Postort; textBox5.Text = person.Telefon; textBox6.Text = person.Email; }

Permalänk
Medlem
Skrivet av atombari22:

Tack för hjälpen. Nu har jag fastand med SelectedIndexChnage jag får error

"System.InvalidCastException: „Unable to cast object of type 'System.String' to type 'AdressBook_2.Person'.”

private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { Person person = (Person)listBox1.SelectedItem; textBox1.Text = person.Name; textBox2.Text = person.Gatu; textBox3.Text = person.Postnr; textBox4.Text = person.Postort; textBox5.Text = person.Telefon; textBox6.Text = person.Email; }

samma fel i annan tappning. Du får in en string/text i SelectedItem - o försöker Casta den till en Person klass. Ett sätt att lösa det på är att med hjälp av din String/Name söka upp rätt Person i din lista. Via LINQ eller Contains

Du borde även på SelectedItems[0] få ut själva den valda raden i listviewen

Permalänk

Jag förstår med hur ska jag göra det? skulle du kunna skriva koden åt mig? För att det ligger lite över mina kunskaper med det skulle var bra att kunna lära sig.

Permalänk

foreach(Person person in personer) { if (listBox1.SelectedItem == person.Name.ToString()|| listBox1.SelectedItem == person.Gatu.ToString() || listBox1.SelectedItem == person.Postnr.ToString()|| listBox1.SelectedItem == person.Postort.ToString()|| listBox1.SelectedItem == person.Telefon.ToString() || listBox1.SelectedItem == person.Email.ToString()) { MessageBox.Show(person.Name + " " + person.Gatu + " " + person.Postnr + " " + person.Postort + " " + person.Telefon + " " + person.Email); textBox1.Text = person.Name.ToString(); textBox2.Text = person.Gatu.ToString(); textBox3.Text = person.Postnr.ToString(); textBox4.Text = person.Postort.ToString(); textBox5.Text = person.Telefon.ToString(); textBox6.Text = person.Email.ToString(); } }

Typ sådär?

Permalänk
Medlem
Skrivet av atombari22:

foreach(Person person in personer) { if (listBox1.SelectedItem == person.Name.ToString()|| listBox1.SelectedItem == person.Gatu.ToString() || listBox1.SelectedItem == person.Postnr.ToString()|| listBox1.SelectedItem == person.Postort.ToString()|| listBox1.SelectedItem == person.Telefon.ToString() || listBox1.SelectedItem == person.Email.ToString()) { MessageBox.Show(person.Name + " " + person.Gatu + " " + person.Postnr + " " + person.Postort + " " + person.Telefon + " " + person.Email); textBox1.Text = person.Name.ToString(); textBox2.Text = person.Gatu.ToString(); textBox3.Text = person.Postnr.ToString(); textBox4.Text = person.Postort.ToString(); textBox5.Text = person.Telefon.ToString(); textBox6.Text = person.Email.ToString(); } }

Typ sådär?

Ja typ så.

Listan kanske inte visar all information om en person, kanske t.ex. endast namn? Och då behöver du inte matcha alla egenskaper för personen utan endast de som visas i listan när valet görs.

Permalänk

Nu har jag problem med att redigera och radera från txt fillen

Permalänk
Medlem

Det är svårt att hjälpa dig utan att se din aktuella kod, eller vad som orsakar problem.

Mitt generella tip är väl att inte försöka uppdatera enskillda rader i filen, utan att skriva filen i sin helhet med alla rader på samma gång.

Kolla t.ex. här för inspiration:
https://learn.microsoft.com/en-us/dotnet/csharp/programming-g...

Permalänk

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Data; using System.IO; namespace AdressBook_2 { public partial class Form1 : Form { //Vägen till filen public string path = @C:\temp\AdressBok.txt; //Listan där läggs till användaren public List<Person> personer = new List<Person>(); bool start = false; public Form1() { InitializeComponent(); } private void Avslutaknap_Click(object sender, EventArgs e) { //Stänger ner programmet this.Close(); } private void Rensaknap_Click(object sender, EventArgs e) { //Rensar listBox listBox1.Items.Clear(); textBox1.Clear(); textBox2.Clear(); textBox3.Clear(); textBox4.Clear(); textBox5.Clear(); textBox6.Clear(); } public void Form1_Load(object sender, EventArgs e) { //Läser allt från txt filen och lägger till listan Person load; StreamReader sr = new StreamReader(@C:\temp\AdressBok.txt); string line = ""; while (!sr.EndOfStream) { load= new Person(); line = sr.ReadLine(); var array = line.Split(','); load.Name = array[0]; load.Gatu = array[1]; load.Postnr = array[2]; load.Postort = array[3]; load.Telefon = array[4]; load.Email = array[5]; personer.Add(load); } sr.Close(); //Ändrad FormBorderStyle till FixedSingle så att man kan inte ändra storleken //samt MaximizeBox to False //Skapar txt fillen var file = @C:\temp\AdressBok.txt; if (!File.Exists(file)) File.Create(file); } private void Registeraknap_Click(object sender, EventArgs e) { //Läser in klassen och läggs till värde Person person = new Person(textBox1.Text, textBox2.Text, textBox3.Text, textBox4.Text, textBox5.Text, textBox6.Text); personer.Add(person); //Om Register metoden går genom då rensas alla rutor if (person.Register()) { listBox1.Items.Add(person.Name); //Rensar textbox efter man har tryck register kanpen textBox1.Clear(); textBox2.Clear(); textBox3.Clear(); textBox4.Clear(); textBox5.Clear(); textBox6.Clear(); } } private void Ladda_uppknap_Click(object sender, EventArgs e) { listBox1.Items.Clear(); //Vissar allt från txt filen i listBoxen List<string> lines = File.ReadAllLines(path).ToList(); foreach (string line in lines) { listBox1.Items.Add(line); } } private void Sökknap_Click(object sender, EventArgs e) { //Tömmer tidigare sökresultat listBox1.Items.Clear(); string text = textBox7.Text; if (text == "") { MessageBox.Show("Finns ej"); } else { foreach (Person person in personer) { if (person.Name.ToLower().Contains(text.ToLower())) { listBox1.Items.Add(person.Name); textBox1.Text = person.Name; textBox2.Text = person.Gatu; textBox3.Text = person.Postnr; textBox4.Text = person.Postort; textBox5.Text = person.Telefon; textBox6.Text = person.Email; textBox7.Clear(); } } } } private void Ta_bortknap_Click(object sender, EventArgs e) { } private void Sparaknap_Click(object sender, EventArgs e) { } private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { foreach(Person person in personer) { if (listBox1.SelectedItem == person.Name.ToString()|| listBox1.SelectedItem == person.Gatu.ToString() || listBox1.SelectedItem == person.Postnr.ToString()|| listBox1.SelectedItem == person.Postort.ToString()|| listBox1.SelectedItem == person.Telefon.ToString() || listBox1.SelectedItem == person.Email.ToString()) { MessageBox.Show(person.Name + " " + person.Gatu + " " + person.Postnr + " " + person.Postort + " " + person.Telefon + " " + person.Email); textBox1.Text = person.Name.ToString(); textBox2.Text = person.Gatu.ToString(); textBox3.Text = person.Postnr.ToString(); textBox4.Text = person.Postort.ToString(); textBox5.Text = person.Telefon.ToString(); textBox6.Text = person.Email.ToString(); } } } } }

Jag försöker adda ta bort knappen och spara knappen men så fort jag försöker att skriva någon kod då får jag oftast fel att det går inte att : „Unable to cast object of type 'System.String' to type 'AdressBook_2.Person'.”

private void Ta_bortknap_Click(object sender, EventArgs e) { // personer.Remove((Person)listBox1.SelectedItem).ToString(); personer.Remove((Person)listBox1.SelectedItem); listBox1.DataSource = null; listBox1.DataSource = personer; start = true; foreach (var c in this.Controls.OfType<TextBox>()) { c.Clear(); } }

Permalänk
Medlem

För att spara

Eftersom du lagrar personer i objektet personer så är det härifrån som du ska hämta data.

//Listan där läggs till användaren public List<Person> personer = new List<Person>();

Det val som användaren har markerat (som du får fram med listBox1.SelectedItem är inte så intressant.

Kolla på denna sidan, där finns det det flera exemepel.

https://www.c-sharpcorner.com/article/c-sharp-write-to-file/

Börja enkelt och skapa en fil som endast innehåller namnet på varje person.

Edit: annat sida med kanske bättre exempel:

https://www.c-sharpcorner.com/article/csharp-streamwriter-exa...

Permalänk
Medlem

För att ta bort

För att ta bort så behöver du
1. Att en rad ska vara makerad i listan (ska du kunna ta bort flera rader samtidigt?)
2. När borttagning initierats så behöver du lista ut vilken person det gäller.
3. Ta bort personen både ur din interna datastruktur samt ur listan

Om du har tänkt att alltid spara listan till fil när programmet avslutas så kan du kanske hoppa över det steget under borttagningen (det ska ju ändå ske senare), annars kanske du vill spara ändringen direkt till filen också.