"Object reference not set to an instance of an object",Czemu ?

0

Witam, mam program który ma 2 formy czyli 2 classy. Główna o nazwie Model zawiera między innymi .

/*Zmienne przechowujące dane w liście głównej*/
        string numer, nazwa, uwaga;
        double cena_hurtowa, cena_detaliczna;
        int ilość_magazyn, ilość_produkcja;
        /*--------------End-------------------------*/

        private Add_model add_model; // Odwołanie do formy Add_model

        public Model()
        {
            InitializeComponent();
        }

        public Model(string my_numer, string my_nazwa, string my_uwaga, double my_cena_hurtowa, double my_cena_detaliczna, int my_ilosc_magazyn, int my_ilosc_produkcja)//Mój konstruktor
        {
            numer = my_numer;
            nazwa = my_nazwa;
            uwaga = my_uwaga;
            cena_hurtowa = my_cena_hurtowa;
            cena_detaliczna = my_cena_detaliczna;
            ilość_magazyn = my_ilosc_magazyn;
            ilość_produkcja = my_ilosc_produkcja;
        }
        
        public List<Model> lista = new List<Model>(); // Deklaracja użycia listy o typie  

Czyli listę, konstruktor do niej. I drugą formę o nazwie Add_model i zawiera.

 public Add_model()
        {
            InitializeComponent();
        }

        public Model model; // Forma z której biore dostęp do listy .

        private void button1_Click(object sender, EventArgs e)// Przycisk dodaj .
        {
            model.lista.Add(new Model(textBox1.Text, textBox2.Text, textBox5.Text, double.Parse(textBox3.Text), double.Parse(textBox4.Text), 0, 0));
        }

Jak widać jest tu odwołanie do formy Model aby mieć dostęp do listy w niej, jest też przycisk dodaj który z tej formy dodaje dane na listę w formie Model.

Niestety po wprowadzeniu danych w formie Add_model i kliknięciu przycisku dodaj kompilator wyrzuca mi następujący komunikat :

"An unhandled exception of type 'System.NullReferenceException' occurred in Haft Anel.exe

Additional information: Object reference not set to an instance of an object." Nie wiem czemu ponieważ wydaje mi się że wszystkie zmienne są przekazane do konstruktora ... Jakieś sugestie ?

Z góry dzięki za pomoc ;)

0

Z tego co widzę to nie inicjalizujesz zmiennej public Model model; ani private Add_model add_model;.

0

@up
Dokładnie tak,dodam jeszcze tylko,że możesz sprawdzać w googlarce sposoby walki ze zgłoszonymi błędami wpisując jego Id,w tym przypadku NullReferenceException który zazwyczaj pojawia sie przy źłej lub braku inicjalizacji.
Na stronie microsoftu w dziale poświęconym programowaniu jest szeroka "biblioteka" rozwiązań na zgłaszane błędy.

0

A niby jak i czym to zainicjować skoro to jest tylko odwołanie się do tego że będę korzystał z danych z danej formy ?

Mógł bym poprosić o przykład takiej inicjacji ?

0

Nie rozumiem. .

Nie odnosisz się do żadnego obiektu więc to co napisałeś równa się temu:

public Model model = null; 
private Add_model add_mode = null;

NULL

A powinno być tak:

public Model model = new Model(); 
private Add_model add_mode = new Add_model();

EDIT:
Więc po kliknięciu w przycisk zaczynasz dodawać dane do listy:

model.lista.Add(new Model(textBox1.Text, textBox2.Text, textBox5.Text, double.Parse(textBox3.Text), double.Parse(textBox4.Text), 0, 0));

Którą o dziwo zainicjowałeś. .

A tak poza tym przyczepie się do tego jeszcze:

public List<Model> lista = new List<Model>(); // Deklaracja użycia listy o typie 

// To jest deklaracja:
public List<Model> lista;
// A to jest inicjalizacja
lista = new List<Model>();
// A to jest deklaracja i inicjalizacja
public List<Model> lista = new List<Model>();
0

oke zastosowałem
private Model model = new Model();
i błąd zniknął ale dla odmiany nie dodaje mi danych do listy ... jakiś pomysł ?

0

Błędu brak ale po dodaniu danych próbowałem je wyświetlić w formie Model

for(int i=0;i<lista.Count;i++)
            {
                label1.Text = lista[i].numer ;
            } 

No i efektu niestety brak ... ;/ jakiś pomysł ?

a czy czasem nie musi być
private Model model = new Model() czy czasem Model() konstruktor nie musi być z jakimiś argumentami dla mojego dodania danych ? bo to tak jak bym się odwoływał do konstruktora domyślnego a nie mojego ?

1

Użyj debuggera prześledź cały proces zobacz co siedzi w tej liście.
Mała podpowiedź sprawdź działanie klawiszów F9 i F11 w VS. ;)

EDIT:
Za szybko zabrałeś się za klikanie okienek nie rozumiesz podstaw języka jeszcze.

0

Masz pierwszą formę o nazwie Model w której masz listę List<Model>.
W drugiej formie tworzysz nową instancję pierwszej formy i dodajesz to do listy z pierwszej formy. Czy ty na pewno to chciałeś osiągnąć?
Albo może to ja się mylę bo nie pokazałeś całych klas.

0
dam1an napisał(a):

Masz pierwszą formę o nazwie Model w której masz listę List<Model>.
W drugiej formie tworzysz nową instancję pierwszej formy i dodajesz to do listy z pierwszej formy. Czy ty na pewno to chciałeś osiągnąć?
Albo może to ja się mylę bo nie pokazałeś całych klas.

Dokładnie to chciałem osiągnąć wklepując dane w 2 formie wpisywać je w liscie w pierwszej formie .
Niestety lista po dodaniu danych jest jakby pusta ...nie wiem czemu, podczas debugowanie używając F11 krok po kroku natrafiłem na takie coś ...http://zapodaj.net/e121d18b32c0c.jpg.html co to i czy to czasem nie ma wpływu na moją listę ?

0

Może napisz co chcesz osiągnąć. Co ta aplikacja właściwie ma robić?

0

Chcę by po wprowadzeniu danych w Formie 2 tej o nazwie Add_model zostały one wpisane do listy w Formie 1 o nazwie Model.

0

To poczytaj w jaki sposób z formy można zwracać wartości na dobry początek:
http://stackoverflow.com/questions/5233502/c-sharp-return-value-from-form

0

I zamiast do listy wrzucać całą Formę, wrzuć tam tylko to co potrzebujesz. Stwórz jakąś klasę

class Model
{
    public Par1 {get;set;}
    public Par2 {get;set;}
    //itd

    public Model(int par1, int par2 ...)
    {
        this.Par1 = par1;
        this.Par2 = par2;
     }
}

Do tego lista List<Model>

0

Oke, postaram się to tak zrobić ale czy ktoś powie mi czemu sposób z którego ja korzystałem nie działa ? Sam go nie wymyśliłem tylko również wziąłem z tutoriala :)

p.s

I zamiast do listy wrzucać całą Formę, wrzuć tam tylko to co potrzebujesz.
Co masz na myśli mówiąc ,że wrzucam do listy całą formę ? do listy dodaje tylko "obiekt" model.lista.Add(new Model(textBox1.Text, textBox2.Text, textBox5.Text, double.Parse(textBox3.Text), double.Parse(textBox4.Text), 0, 0)); .

0
maniek910 napisał(a):

Oke, postaram się to tak zrobić ale czy ktoś powie mi czemu sposób z którego ja korzystałem nie działa ? Sam go nie wymyśliłem tylko również wziąłem z tutoriala :)

Pokaż cały kod to może ktoś dojdzie do tego.

maniek910 napisał(a):

Co masz na myśli mówiąc ,że wrzucam do listy całą formę ?

U Ciebie Model to forma, tak mi się wydaje po tych kawałkach kodu które wstawiłeś.

0

Oke to jest pierwsza forma Model:
11.jpg
kod :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace Haft_Anel
{
    public partial class Model : Form
    {
        /*Zmienne przechowujące dane w liście głównej*/
        public string numer { get; set; }
        public string nazwa { get; set; }
        public string uwaga{ get; set; }
        public double cena_hurtowa{ get; set;}
        public double cena_detaliczna { get; set; }
        public int ilość_magazyn { get; set;}
        public int ilość_produkcja { get; set; }
        /*--------------End-------------------------*/

        public Add_model add_model; // Instancja do formy Add_model

        public Model()
        {
            InitializeComponent();
        }

        public Model(string my_numer, string my_nazwa, string my_uwaga, double my_cena_hurtowa, double my_cena_detaliczna, int my_ilosc_magazyn, int my_ilosc_produkcja)//Mój konstruktor
        {
            numer = my_numer;
            nazwa = my_nazwa;
            uwaga = my_uwaga;
            cena_hurtowa = my_cena_hurtowa;
            cena_detaliczna = my_cena_detaliczna;
            ilość_magazyn = my_ilosc_magazyn;
            ilość_produkcja = my_ilosc_produkcja;
        }
        
        public List<Model> lista = new List<Model>(); // Deklaracja i inicjacja użycia listy o typie MODEL  

        private void Model_Load(object sender, EventArgs e) // URUCHOMIENIE PROGRAMU 
        {
            if(File.Exists(Environment.CurrentDirectory + "\\data"))
            { 
                using(BinaryReader br = new BinaryReader(File.Open(Environment.CurrentDirectory + "\\data",FileMode.Open)))
                {
                    while(br.BaseStream.Position < br.BaseStream.Length)
                    {
                        lista.Add(new Model(br.ReadString(), br.ReadString(), br.ReadString(), br.ReadDouble(), br.ReadDouble(), br.ReadInt32(), br.ReadInt32()));
                    }
                }
            }
            else 
            {
                MessageBox.Show("Prawdopodobnie jest to pierwsze uruchomienie programu, ponieważ nie odnaleziono pliku z danymi.", "Pierwsze uruchomienie.");
            }
        }

        private void Model_FormClosing(object sender, FormClosingEventArgs e)// ZAKOŃCZENIE PROGRAMU
        {
            using(BinaryWriter bw = new BinaryWriter(File.Open(Environment.CurrentDirectory + "\\data",FileMode.Create)))
            {
                for(int i=0 ; i < lista.Count ; i++)
                {
                    bw.Write(lista[i].numer);
                    bw.Write(lista[i].nazwa);
                    bw.Write(lista[i].uwaga);
                    bw.Write(lista[i].cena_hurtowa);
                    bw.Write(lista[i].cena_detaliczna);
                    bw.Write(lista[i].ilość_magazyn);
                    bw.Write(lista[i].ilość_produkcja);
                }
            }
        }

        /*Menu Strip Start*/
        private void dodajWzórToolStripMenuItem_Click(object sender, EventArgs e)// Dodaj wzór w Menu Strip
        {
            add_model = new Add_model();
            add_model.Show();
        }

        private void zakończToolStripMenuItem_Click(object sender, EventArgs e)// Zakończ w Menu Strip
        {
            Application.Exit();
        }

        /*Menu Strip Koniec*/

        private void button1_Click(object sender, EventArgs e) // pokaż kawałek listy.
        {
            for(int i=0;i<lista.Count;i++)
            {
                label1.Text = lista[i].numer ;
            }
        }

        
    }
} 

Oto druga forma Add_model:
22.jpg
i kod :

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Haft_Anel
{
    public partial class Add_model : Form
    {
        public Add_model()
        {
            InitializeComponent();
        }

        private Model model = new Model(); // Instancja do formy Model aby mieć dostęp do listy.

        private void button1_Click(object sender, EventArgs e)// Przycisk dodaj .
        {
            model.lista.Add(new Model(textBox1.Text, textBox2.Text, textBox5.Text, double.Parse(textBox3.Text), double.Parse(textBox4.Text), 0, 0));
            textBox1.Text = null;
            textBox2.Text = null;
            textBox3.Text = null;
            textBox4.Text = null;
            textBox5.Text = null;
        }
    }
}

Z góry dziękuję za pomoc.

0

W drugiej formie private Model model = new Model() to jest winowajcą. Zamiast tego przekaż referencje w konstruktorze do pierwszej formy.

W drugiej formie

public Add_model(Model model)
        {
            InitializeComponent();
            this.model = model
        }
private Model model;

i inicjacja w pierwszej wyglądać powinna tak:

add_model = new Add_model(this);
0

Niech Ci Bóg w dzieciach wynagrodzi : ) teraz tylko muszę rozkminić czemu tak to działa : D

0

private Model model = new Model() tworzy nową instancje formy. Gdybyś dał to z powrotem i w drugiej formie dodał gdzieś model.Show() to wyświetliło by Ci się to okienko.
A gdybyś zostawił tak jak napisałem w poprzednim poście i dał gdzieś model.Show() to dostałbyś pewnie jakiś błąd związany z tym że to okno jest już wyświetlone.

Aha i jak dodasz coś takiego to zobaczysz że do listy dodajesz nowe formy.

for(int i=0;i<lista.Count;i++)
            {
                label1.Text = lista[i].numer ;
                lista[i].Show();
            }

Przeleć jakiś tutorial.

0

O kurde to kolosalnie niewydajne dla programu oO, czyli aby uniknąć takiej sytuacji muszę stworzyć sobie klasę tak jak pokazywałeś wyżej ? I stworzyć instancje do niej ?

0

No powinieneś taką klasę jak pokazałem dodawać do listy.

0

Oke napotkałem problem , chciałem dodawać do listy klasę którą stworzyłem, ale kompilator wyrzuca mi błąd

Error 1 The type or namespace name 'model' could not be found (are you missing a using directive or an assembly reference?) D:\C#2013 Programs\just try\just try\Form2.cs 15 22 just try

Forma1:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace just_try
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private Form2 f2; // Instalcja do Form2

        public class model 
        {
            public string Value1 { get; set;}
            public string Value2 { get; set;}
            public int Value3 { get; set;}

            public model(string my_Value1,string my_Value2,int my_Value3) // mój konstruktor
            {
                this.Value1 = my_Value1;
                this.Value2 = my_Value2;
                this.Value3 = my_Value3;
            }
        }

        public List<model> lista = new List<model>();// deklaracja i inicjacja listy typu model

        private void button1_Click(object sender, EventArgs e)//Button open new form 
        {
            f2 = new Form2(this);
            f2.Show();
        } 
    }
}
 

I Form2 :

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace just_try
{
    public partial class Form2 : Form
    {
        public Form2(model f1)
        {
            InitializeComponent();
            this.f1 = model;
        }
        private model f1;
        

        private void button1_Click(object sender, EventArgs e)// Add data to list from form1
        {
            //dodawanie do listy 
        }


    } 
}

Jak to zrobić żeby on wiedział że model to moja klasa ? Z formy 1

0

Wciśnij Alt+Shift+C i wrzuć do nowego pliku tą klasę.
Serio ogarnij jakiś tutorial bo to są podstawy.

0

Oke wszem i wobec bardzo bardzo dziękuje za pomoc. Taki tip w MVS2013 dodanie nowej klasy nie robi się przez Alt+Shift+C , ja zrobiłem to przez Project -> Add Class.

Gdyby komuś miało się to przydać wrzucam co jak zrobiłem :
Class1.cs:

public class person
    {
        public string imie { get; set; }
        public string nazwisko { get; set; }
        public person(string my_imie, string my_nazwisko)
        {
            this.imie = my_imie;
            this.nazwisko = my_nazwisko;
        }
    } 

Form1.cs:

 namespace XX
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public List<person> lista = new List<person>();

        private Form2 f2;
        private void Form1_Load(object sender, EventArgs e)
        {
            f2 = new Form2(this);
            f2.Show();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            for(int i=0;i<lista.Count;i++)
            {
                label1.Text = label1.Text + lista[i].imie + " " + lista[i].nazwisko;
            }
        }
    }
}

Form2.cs:

 namespace XX
{
    public partial class Form2 : Form
    {
        public Form2(Form1 f1)
        {
            InitializeComponent();
            this.f1 = f1;
        }

        private Form1 f1;
        
        private void button1_Click(object sender, EventArgs e)
        {
            f1.lista.Add(new person(textBox1.Text, textBox2.Text));
        }
    }
}

Jeszcze raz dzięki za pomoc, na was zawsze można liczyć : - )

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