• 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

Object Storage Arubacloud
0 głosów
480 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 (252,660 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,590 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ź 820 wizyt
pytanie zadane 10 grudnia 2015 w PHP przez makoso Mądrala (7,380 p.)
0 głosów
0 odpowiedzi 67 wizyt
0 głosów
1 odpowiedź 629 wizyt

92,539 zapytań

141,382 odpowiedzi

319,476 komentarzy

61,928 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...