• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Błąd z Unable to cast object of type 'System.String' to type

VPS Starter Arubacloud
0 głosów
446 wizyt
pytanie zadane 20 września 2022 w C# przez AtomBari Początkujący (440 p.)
edycja 20 września 2022 przez AtomBari

Witam, z góry mówię że jestem bardzo początkujący więc proszę o konkretne wyjaśnienie i podanie rozwiązania jeśli to możliwe. Naukę prowadzę w języku szwedzkim dlatego dziwne nazwy :)

Błąd który mi się pokazuję najczęściej  to:

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

Druga sprawa jak zrobić żeby usuwać wcześniej dodany kontakt? oraz jak go edytować?

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);
                    _writer.Close();
                    return true;                    
                }
                else return false;
            }
        }
        public bool CheckEmail()
        {
            
            if (Email.Contains('@') && Email.Contains('.'))
            {
                return true;
            }
            else
            {
                MessageBox.Show("Brakuje @");
                return false;
            }
        }
    }
}
namespace AdressBook_2
{
    public partial class Form1 : Form
    {   
        public string path = @"C:\temp\AdressBok.txt";
        
        public List<Person> personer = new List<Person>();
        bool start = false;
        public Form1()
        {
            InitializeComponent();           
        }
        private void Avslutaknap_Click(object sender, EventArgs e)
        {
            
            this.Close();
        }

        private void Rensaknap_Click(object sender, EventArgs e)
        {
            
            listBox1.Items.Clear();
            textBox1.Clear();
            textBox2.Clear();
            textBox3.Clear();
            textBox4.Clear();
            textBox5.Clear();
            textBox6.Clear();
        }

        public void Form1_Load(object sender, EventArgs e)
        {   
            
            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();

            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);
            personer.Add(person);

            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();
        
            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)
        {
            
            listBox1.Items.Clear();
            string text = textBox7.Text;
            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;
                }
            }
        }

        private void Ta_bortknap_Click(object sender, EventArgs e)
        {
            
          

        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

           
                listBox1.SelectedItem.ToString();
                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;

        }

komentarz 20 września 2022 przez tmar1212 Bywalec (2,600 p.)
Jak używasz tego kodu, że jest ten błąd? Debugowałeś?
komentarz 20 września 2022 przez AtomBari Początkujący (440 p.)

W momencie kiedy klikam na dany obiekt po lewej stronie to wyskakuje mi ten błąd

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

komentarz 20 września 2022 przez PH03NIX Mądrala (6,130 p.)

Z tego co widzę w listboxie przechowujesz wyłącznie imienia osób.

 listBox1.Items.Add(person.Name);

A po kliknięciu starasz się imię (stringa) skonwertować na osobę (person). 

Person person = ((Person)listBox1.SelectedItem);

Nie powinieneś raczej wyszukać osoby o danym imieniu (wybranym z listy) w liście osób (personer)?

komentarz 20 września 2022 przez VBService Ekspert (251,210 p.)
edycja 20 września 2022 przez VBService

BTW, chyba najpierw sprawdzasz czy plik istnieje i wtedy ewentualnie odczytujesz, a jak nie istnieje - "tworzysz". No i skoro  masz

public string path = @"C:\temp\AdressBok.txt";

to używaj path

        private void Form1_Load(object sender, EventArgs e)
        {
            if (!File.Exists(path))
                File.Create(path);
            else
            {
                Person load;
                StreamReader sr = new StreamReader(path);
                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();
            }
        }

 

można też

listBox1.Items.Clear();
         
List<string> lines = File.ReadAllLines(path).ToList();
foreach (string line in lines)
{
    listBox1.Items.Add(line);
}

// na

listBox1.Items.Clear();
         
string[] lines = File.ReadAllLines(path);
listBox1.Items.AddRange(lines);

// lub

listBox1.Items.Clear();
listBox1.Items.AddRange(File.ReadAllLines(path));

 

komentarz 20 września 2022 przez Wiciorny Ekspert (269,120 p.)
ten mechanizm też zadziała, bo działanie metody na to pozwoli, w sytuacji kiedy nie ma pliku nic się nie wykona, więc ostatecznie plik zostanie otworzony, jeśli istnieje już plik- to, tak czy siak nie zostanie on na nowo utworzony, a jednocześnie StremWrite/StreamRead bedzie modyfikowalo ten jeden plik, nie tworząc nowego.
komentarz 21 września 2022 przez AtomBari Początkujący (440 p.)

@PH03NIX,  Ale w jaki sposób mam wyszukać osoby o danym imieniu (wybranym z listy) w liście osób (personer)?

1
komentarz 21 września 2022 przez PH03NIX Mądrala (6,130 p.)
   // Person person = ((Person)listBox1.SelectedItem);
            var fPerson = personer.SingleOrDefault(person => person.Name == (string)listBox1.SelectedItem);

Możesz to zrobić to tak jak powyżej co nie zmienia tego, że jak 2 osoby będą miały te same imię to nie będziesz w stanie ich rozróżnić.

Lepiej dodać jako item obiekt klasy

//zamiast
//listBox1.Items.Add(person.Name);
//dać
listBox1.Items.Add(person);

i ustawić DisplayMember listboxa na "Name"

listBox1.DisplayMember = "Name";

I wtedy możesz użyć:

 Person person = ((Person)listBox1.SelectedItem);

 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 817 wizyt
pytanie zadane 10 grudnia 2015 w PHP przez makoso Mądrala (7,380 p.)
0 głosów
0 odpowiedzi 66 wizyt
0 głosów
1 odpowiedź 627 wizyt

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...