• 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

0 głosów
50 wizyt
pytanie zadane 20 września w C# przez AtomBari Nowicjusz (140 p.)
edycja 20 września 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 przez tmar1212 Bywalec (2,040 p.)
Jak używasz tego kodu, że jest ten błąd? Debugowałeś?
komentarz 20 września przez AtomBari Nowicjusz (140 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 przez PH03NIX Mądrala (5,270 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 przez VBService Mędrzec (186,940 p.)
edycja 20 września 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 przez Wiciorny Ekspert (231,570 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 przez AtomBari Nowicjusz (140 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 przez PH03NIX Mądrala (5,270 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ź 775 wizyt
pytanie zadane 10 grudnia 2015 w PHP przez makoso Mądrala (7,380 p.)
0 głosów
1 odpowiedź 519 wizyt

89,128 zapytań

137,730 odpowiedzi

307,728 komentarzy

59,180 pasjonatów

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...