Usunięcie osoby z pliku XML oraz z ListBox'a

Odpowiedz Nowy wątek
2018-05-15 09:22
0

Hejka, mam mały problem, jestem uczniem na praktykach i otrzymaliśmy zadanie do zrobienia, jednakże nie potrafię sobie poradzić ze zrobieniem usunięcia osoby z ListBox'u oraz pliku, jakby ktoś dał radę pomóc byłoby cudownie.

namespace Zadanie_4
{
    public partial class Osoba : Form
    {
        XmlSerializer xs;
        List<Osoby> ls;

        public Osoba()
        {
            InitializeComponent();

            ls = new List<Osoby>();
            xs = new XmlSerializer(typeof(List<Osoby>));
        }

        private void bDodaj_Click(object sender, EventArgs e)
        {
            FileStream fs = new FileStream("E:\\Osoby.xml", FileMode.Create, FileAccess.Write);
            Osoby sc = new Osoby();
            sc.imie = tbImie.Text;
            sc.nazwisko = tbNazwisko.Text;
            sc.miejscowosc = tbMiejscowosc.Text;
            sc.ulica = tbUlica.Text;
            sc.pesel = int.Parse(tbPesel.Text);
            sc.numerDomu = int.Parse(tbNrDomu.Text);

            ls.Add(sc);

            xs.Serialize(fs, ls);
            fs.Close();

        }

        private void button1_Click(object sender, EventArgs e)
        {
            List<string> list = new List<string>();

            FileStream fs = new FileStream("E:\\Osoby.xml", FileMode.Open, FileAccess.Read);
            ls = (List<Osoby>)xs.Deserialize(fs);
            foreach (var item in ls)
            {
                string osoba = string.Format("Imie: {0} | Nazwisko: {1} | Pesel: {2} | Miejscowosc: {3} | Ulica: {4} | Nr Domu: {5} |",item.imie,item.nazwisko,item.pesel,item.miejscowosc,item.ulica,item.numerDomu);
                list.Add(osoba);
            }
            listBox1.DataSource = list;
            fs.Close();
        }

        private void bUsun_Click(object sender, EventArgs e)
        {

        }
    }
}
edytowany 1x, ostatnio: Basstard, 2018-05-15 09:35

Pozostało 580 znaków

2018-05-15 10:02
0

Rozumiem, że usuwać zaznaczony element w ListBox? Najlepiej usuwać z deserializowanej listy, odświeżyć listboxa nową zawartością listy z usuniętym elementem, a listę z usuniętym elementem zserializować do pliku.

P.S. Najlepiej serializację i deserializację zrób sobie w osobnych metodach, bo teraz masz je bezpośrednio w eventach buttonow i nie możesz łatwo ich używać Ponieważ nie masz DataBindings tylko bezpośrednio DataSource, to żeby odświeżyc ListBox jak już usuniesz element z listy musisz zrobić coś takiego (trochę to nieeleganckie):

listBox1.DataSource = null;
listBox1.DataSource = list;
edytowany 1x, ostatnio: litrmleka, 2018-05-15 10:11

Pozostało 580 znaków

2018-05-15 10:05
0
litrmleka napisał(a):

Rozumiem, że usuwać zaznaczony element w ListBox? Najlepiej usuwać z deserializowanej listy, odświeżyć listboxa nową zawartością listy z usuniętym elementem, a listę z usuniętym elementem zserializować do pliku.

A jak to napisać? >.< Wybacz, ale jestem kompletnie zielony w tym, a zbytniej pomocy od osób tu pracujących nie otrzymam, a jeżeli nie wykonam tych zadań to ciężko będzie z zaliczeniem praktyk, więc byłbym bardzo wdzięczny, gdybyś pomógł mi to zrobić (mogę nawet podesłać zdjęcie z treścią zadania, zapewne zrobienie go przez osobę bardziej doświadczoną zajmie mniej czasu niżeli mi, gdyż robię je już 3 dzień i stoję nadal na tym samym zadaniu).

Pozostało 580 znaków

2018-05-15 13:54
0

Przede wszystkim do XML masz specjalną klasę XmlDocument i pochodne. Jest to dużo sprytniejsze niż FileStream.
Co musisz zrobić:

  1. Zaczytaj osoby z XML do jakiejś listy: List<osoby>
    Swoją drogą klasa powinna nazywać się OSOBA, a nie OSOBY, ponieważ trzymasz w niej jedną osobę, a nie kilka osób. Więc lista wtedy powinna być: List<osoba>
  2. Przypisz dane do listboxa:
    listBox.DataSource = lista;

    gdzie lista to lista z osobami.
    Żeby Ci się wyświetliło na ListBox to, co chcesz, klasa Osoba powinna mieć przesłoniętą metodę ToString(), która zwróci to, co chcesz żeby pojawiło się na ListBoxie, np. imię i nazwisko:

    public override string ToString()
    {
    return Imie + " " + Nazwisko;
    }
  3. Następnie w ListBoxClick możesz przechwycić zaznaczoną osobę i usunąć ją z listy:
//przechwycenie zaznaczonej osoby
Osoba osoba = listBox.SelectedItem as Osoba; 

//usunięcie jej z listy
if(osoba != null)
  lista.Remove(osoba);

Teraz możesz nadpisać po prostu plik XML.

Nie twórz formy o nazwie Osoba - to nic nie mówi tylko wprowadza w błąd. Jeśli chcesz zrobić jakiś edytor osób, to zrób formę o nazwie: OsobaEditor lub OsobaEditorForm. A najlepiej trzymaj się tylko angielskiego nazewnictwa i wtedy masz klasę Person i PersonEditorForm.

edytowany 1x, ostatnio: Adam Boduch, 2018-05-15 14:28
@Adam Boduch: coś poszło nie tak z formatowaniem - Juhas 2018-05-15 13:54
To jest błąd parsera. Zgłosiłem sprawę rok temu, ale błąd jeszcze niepoprawiony. Tymczasem poprawiłem kod aby wyświetlał się prawidłowo. - Adam Boduch 2018-05-15 14:28

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0