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í.
Avatar
hurvajs
Člen
Avatar
hurvajs:14.3.2013 18:24

Zdravím, při pokusu přidat data do třídy, mi vyskočí tato hláška...An unhandled exception of type 'System.NullRe­ferenceExcepti­on' occurred in Maturitni projekt.exe
Additional information: Odkaz na objekt není nastaven na instanci objektu.
Zde je kód window, kde při vytvoření nové zakázky chci, aby se zakázka přidala i do Listu v třídě zákazník, ale pořád mi to hází chybu...
Prosím o radu

public partial class NovaZakazka : Window
    {
        private static readonly IEvidenceZakazek repozitar = MainWindow.repozitar;
        public NovaZakazka()
        {
            InitializeComponent();
            MainWindow.repozitar.NactiDataZeSouboru();
        }

        private void BtnPridat_Click(object sender, RoutedEventArgs e)
        {
            int id = int.Parse(IdOdberatelTextBox.Text);


            PoznamkyTextBox.SelectAll();
            string poznamky = PoznamkyTextBox.Selection.Text;
            ZakazkaKatalog nova = new ZakazkaKatalog()
            {
                Odberatel = repozitar.ZiskatZakaznikaDleId(id),
                Id = IdZakazkyTextBox.Text,
                DatumPlneni = DateTime.Parse(DatumPlneniTextBox.Text),
                DatumVytvoreni = DateTime.Parse(DatumVytvoreniTextBox.Text),
                Zaloha = decimal.Parse(ZalohaTextBox.Text),
                Poznamka = poznamky,



            };

            Zakaznik upravovany = (Zakaznik)nova.Odberatel;
            upravovany.KatalogoveZakazky.Add(nova);
            repozitar.UpravZakaznika(upravovany);
            repozitar.PridatKatZakazku(nova);

            repozitar.UlozDataDoSouboru();
            this.Close();

        }
    }
}

zde je třída zákazník

public class Zakaznik
   {
       public int Id { get; set; }
       public string Jmeno { get; set; }
       public string Prijmeni { get; set; }
       public string Ulice { get; set; }
       public string Mesto { get; set; }
       public string Psc { get; set; }
       public string Telefon { get; set; }
       public string Email { get; set; }
       public string Ico { get; set; }
       public string Dic { get; set; }

       public List<Faktura> Faktury { get; set; }
       public List<ZakazkaKusova> KusoveZakazky { get; set; }
       public List<ZakazkaKatalog> KatalogoveZakazky { get; set; }

       public override string ToString()
       {
           return this.Jmeno + " " + this.Prijmeni;
       }
   }

popř. zde je link na celý program http://leteckaposta.cz/594657102

 
Odpovědět
14.3.2013 18:24
Avatar
Michal Žůrek - misaz:14.3.2013 19:10

Skoušel jsi debuger? Ten by ti řekl víc. Stejně tak s trochou angličtiny bys došel k tomu že cheš přidat něco do null a to zkrátka a dobře nejde.

KatologoveZakazky = null

Editováno 14.3.2013 19:11
 
Nahoru Odpovědět
14.3.2013 19:10
Avatar
hurvajs
Člen
Avatar
Odpovídá na Michal Žůrek - misaz
hurvajs:14.3.2013 19:45

Aha, tak to je teda "pěkný". A nevíš, jak by se to dalo vyřešit ?

 
Nahoru Odpovědět
14.3.2013 19:45
Avatar
Odpovídá na hurvajs
Michal Žůrek - misaz:14.3.2013 19:59

před ten řádek kódu na kterém vzníka chyba dej:

upravovany.KatalogoveZakazky = new List<ZakazkaKatalog>();

Jakmile jsem to udělal, fungovalo mi to.

 
Nahoru Odpovědět
14.3.2013 19:59
Avatar
hurvajs
Člen
Avatar
Odpovídá na Michal Žůrek - misaz
hurvajs:14.3.2013 20:11

Na to jak je to jednoduché, by mě to asi nikdy nenapadlo... Jinak samozřejmě jsem tvým dlužníkem.

 
Nahoru Odpovědět
14.3.2013 20:11
Avatar
Michal Žůrek - misaz:14.3.2013 20:24

:)
Já moc C# neumím (spíš mám radši VB.NET ale jsou si podobné), taky mi to celkem trvalo než jsem na to přišel.

 
Nahoru Odpovědět
14.3.2013 20:24
Avatar
hurvajs
Člen
Avatar
Odpovídá na Michal Žůrek - misaz
hurvajs:15.3.2013 8:21

Ještě jsem to obalil do if

if (upravovany.KatalogoveZakazka !=null)
{upravovany.KatalogoveZakazky = new List<ZakazkaKatalog>();}
/code]
 
Nahoru Odpovědět
15.3.2013 8:21
Avatar
lcet.m
Člen
Avatar
Odpovídá na hurvajs
lcet.m:15.3.2013 10:38

Ještě jsem to obalil do if, aby to náhodou nefungovalo :)

1.) Žádná slušně vychovaná třída nezveřejňuje List s hodnotou null. Zvykni si inicializovat v konstruktoru

2.) Takhle vás to na nějaké škole učí? Zjevně je to WPF, tak proč to nepíšeš jako ve WPF? WPF není barevnější WinForm, jde tam o oddělelní UI a logiky.

 
Nahoru Odpovědět
15.3.2013 10:38
Avatar
Kit
Tvůrce
Avatar
Odpovídá na hurvajs
Kit:15.3.2013 10:50

Ta třída Zakaznik je nějaká hubená. Bude mít někdy i nějaké metody?

Nahoru Odpovědět
15.3.2013 10:50
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
hurvajs
Člen
Avatar
Odpovídá na Kit
hurvajs:15.3.2013 11:41

Na metody mám repozitar +interface

 
Nahoru Odpovědět
15.3.2013 11:41
Avatar
Kit
Tvůrce
Avatar
Odpovídá na hurvajs
Kit:15.3.2013 12:41

Aha, já si dávám do repozitářů raději celé třídy včetně metod. Snažím se mít co nejmenší rozhraní s okolím.

Nahoru Odpovědět
15.3.2013 12:41
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
hurvajs
Člen
Avatar
Odpovídá na lcet.m
hurvajs:15.3.2013 14:59

tak to if nefunguje.. :) ohledně toho učení, dva roky jsme se neučily => nový učitel a teď to bereme jen jako rychlokurz... A ohledně toho konstruktoru, to nevím jak udělat, kdyby si byl tak hodný a trochu mi to vysvětlil prosím.. :)

 
Nahoru Odpovědět
15.3.2013 14:59
Avatar
Kit
Tvůrce
Avatar
Odpovídá na hurvajs
Kit:15.3.2013 15:12

Kdybys ten program napsal objektově, tak bychom se v tom možná vyznali, ale máš v tom příliš mnoho skrytých závislostí.

Nahoru Odpovědět
15.3.2013 15:12
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na hurvajs
Michal Žůrek - misaz:15.3.2013 15:15

V if bys musel dát místo operátoru != operátor ==
Tvoje:

Pokud se ... nerovná null, inicializuj to.

A správně:

Pokud se ... rovná null, inicializuj to.
Editováno 15.3.2013 15:17
 
Nahoru Odpovědět
15.3.2013 15:15
Avatar
lcet.m
Člen
Avatar
Odpovídá na hurvajs
lcet.m:15.3.2013 15:35

Zjednodušeně řečeno, konstruktor je metoda, která se volá při vytváření instance třídy. Tj. třída s property typu List<string> by měla vypadat nějak takhle:

public class Trida
{
   public List<string> Texty {get;set;}

   //a tohle je ten konstruktor:
   public Trida()
   {
      Texty = new List<string>();
   }

}

Když potom použiješ zápis

Trida t = new Trida();

To new Trida() je volání konstruktoru.

Nic ve zlém, ale pokud máš problém s konstruktory a podmínkami, nemá smysl pouštět se do ničeho dalšího. Učitel může být blbec (a často je), ale jestli si tohle nejseš schopen nastudovat sám, tak nemáš v tomhle oboru co dělat (protože jsem zahlédl něco o maturitní práci tak předpokládám, že studuješ programování).

 
Nahoru Odpovědět
15.3.2013 15:35
Avatar
hurvajs
Člen
Avatar
Odpovídá na lcet.m
hurvajs:15.3.2013 16:29

no programování přímo ne, studuji bohužel, ze zdravotních důvodů, Informatiku v ekonomice (informatika jen okrajově)..

 
Nahoru Odpovědět
15.3.2013 16:29
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 16 zpráv z 16.