IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Přepsání dat v kolekci i když zápisu předchází výjimka

Aktivity
Avatar
Marek
Člen
Avatar
Marek:15.9.2017 23:25

Ahoj,

do výukového projektu "Upomínač narozenin v C#" se snažím doimplementovat možnost úpravy záznamu s kontrolou, zda již neexistuje shodný záznam. Problém je, že když odklepnu chybovou hlášku a poté okno zavřu, tak se změna stejně provede.

Událost

private void upravitButton_Click(object sender, RoutedEventArgs e)
        {
            if (osobyListBox.SelectedItem != null)
            {
                UpravitOsobaWindow upravitOsobaWindow = new UpravitOsobaWindow(spravceOsob, (Osoba)osobyListBox.SelectedItem);
                upravitOsobaWindow.Owner = this;
                upravitOsobaWindow.ShowDialog();
            }
            else
            {
                SystemSounds.Exclamation.Play();
            }
        }

Kód formuláře UpravitOsobaWindow

public partial class UpravitOsobaWindow : Window
    {
        private SpravceOsob spravce;
        private Osoba osoba;
        public UpravitOsobaWindow(SpravceOsob spravce, Osoba osoba)
        {
            InitializeComponent();
            this.spravce = spravce;
            this.osoba = osoba;
            DataContext = osoba;
        }

        private void upravButton_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                spravce.Zmen(upravJmenoTextBox.Text, upravNarozeninyDatePicker.SelectedDate, osoba);
                spravce.Uloz();
                Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Chyba", MessageBoxButton.OK, MessageBoxImage.Exclamation);
            }
        }
    }

Implementace SpravceOsob.Zmen()

public void Zmen(string jmeno, DateTime? datumNarozeni, Osoba osoba)
        {
            if (jmeno.Length < 3)
                throw new ArgumentException("Jméno je příliš krátké");
            if (datumNarozeni == null)
                throw new ArgumentException("Nebylo zadané datum narození");
            if (datumNarozeni.Value.Date > DateTime.Today)
                throw new ArgumentException("Datum narození nesmí být v budoucnosti");
            Osoba zmnenaOsoba = new Osoba(jmeno, datumNarozeni.Value.Date);
            if (Osoby.Contains(zmnenaOsoba))
                throw new ArgumentException(string.Format("Osoba {0} s datem narození {1} již v aplikaci existuje!\nProsím nevkládejte duplicitní záznamy.", zmnenaOsoba.Jmeno, zmnenaOsoba.Narozeniny.ToShortDateString()));
            int index = Osoby.IndexOf(osoba);
            Osoby.Remove(osoba);
            Osoby.Insert(index, zmnenaOsoba);
            NajdiNejblizsi();
        }
 
Odpovědět
15.9.2017 23:25
Avatar
Neaktivní uživatel:16.9.2017 0:28

V konstruktoru predavas instanciu objektu, tu editujes. Ked sa zavrie okno, zmeny uz su v povodnom objekte. Nebude to nahodou tento pripad? To je aktualne jedine, co ma napada.

Nahoru Odpovědět
16.9.2017 0:28
Neaktivní uživatelský účet
Avatar
Marek
Člen
Avatar
Odpovídá na Neaktivní uživatel
Marek:16.9.2017 6:20

Diky za odpoved. Nemel by to byt ten pripad, protoze celou osobu mazu a nahrazuji novou. To vse az po vyvolaji vyjimky. Zvlastni taky je, ze nemenim puvodni osobu, ale nahrazuji ji a ackoli tedy dojde ke smazani a vlozeni noveho objektu do ObservableColle­tion, tak kontrolka listBox na zmenu nereaguje.

 
Nahoru Odpovědět
16.9.2017 6:20
Avatar
Marek
Člen
Avatar
Odpovídá na Marek
Marek:16.9.2017 6:21

Pokud osobu vlozim nebo smazu, tak se ta sama kontrolka obnovi, takze binding funguje dobre. A je to navic to same, co delam pri zmene, take smazu a vlozim osobu...

 
Nahoru Odpovědět
16.9.2017 6:21
Avatar
Marek
Člen
Avatar
Marek:20.9.2017 17:44

Tak chyba byla v tom, že jsem v XAMLu bindoval TextBox a DatePicker primo na předanou instanci osoby. Tudíž pravděpodobně opravdu docházelo ke změně v objektu a ObservableCollec­tion změnu nepromítla, protože událost vyvolá pouze při změně v kolekci (přidání / vymazání), nikoli při změně uloženého objektu.

Aby mi formulář uprav osobu předvyplnil TextBox a DatePicker jsem nakonec místo bindingu využil přímo konstruktor.

public UpravitOsobaWindow(SpravceOsob spravce, Osoba osoba)
        {
            InitializeComponent();
            this.spravce = spravce;
            this.osoba = osoba;
            upravJmenoTextBox.Text = osoba.Jmeno;
            upravNarozeninyDatePicker.SelectedDate = osoba.Narozeniny;
        }
Editováno 20.9.2017 17:45
 
Nahoru Odpovědět
20.9.2017 17:44
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.