Odwołanie do klas innej formy.

0

Cześć,

Pare dni temu zacząłem programować w c# windows forms application.
Mam pytanie odnośnie form. Mam formy: form1, form2, form3.
Jak w formie form2 utworzyć forme form3 (np po kliknieciu buttona) tak, żeby po stworzeniu kolejne kliknięcie już nie tworzyło znowu form3 tylko otwierało tą formę która wcześniej powstała. A następnie chce, żeby w form1 mógł się odwołać do obiektu form3.

Z góry dziękuję za odpowiedź,
Pozdrawiam

3

Było. Zamiast zamykać ukrywaj formę, a referencję trzymaj w polu, a nie w zmiennej lokalnej. Jeśli chcesz wartością pola podzielić się z inną klasą, to ubierz ją w publiczną właściwość.
Generalnie oba tematy były poruszane na tym forum dziesiątki, jeśli nie setki razy, wystarczy dobrze poszukać.

BTW co to są "klasy innej formy"? Formatka jest klasą, Jeśli chcesz mieć dostęp do klas zdefiniowanych w innej klasie, to wystarczy je uczynić publicznymi (ewentualnie internal i/lub protected), ALE to czego potrzebujesz to dostęp do zmiennych z innej klasy. Nieprawidłowa terminologia użyta przez Ciebe sugeruje, że brakuje Ci dość podstawowej wiedzy w dziedzinie programowania obiektowego i możesz mieć kłopot ze zrozumieniem odpowiedzi, w której nie będzie podanego gotowego rozwiązania. Nie chcę Cię obrazić, po prostu stwierdzam fakt, a wnioskiem z tego jest to, że potrzebujesz się dokształcić (także w dziedzinie samodzielnego zdobywania wiedzy, co jest - a przynajmniej powinno być - najważniejszą umiejętnością każdego programisty).

0

To prawda, że jestem baaaaardzo początkujący jeśli chodzi o programowanie obiektowe, dlatego pytam bo po prostu uczę się tego krok po kroku.
Dlatego dziękuję za odpowiedź i postaram się poczytać na ten temat.

0

Powiem inaczej, chcę zrobić aplikacje sklepu z książkami jako projekt do szkoły, dlatego chcę żeby 3 forma- formKoszyk wiedziała jakie książki są w koszyku po naciśnięciu przycisku pbDodaj_do_koszyka który jest w formie2- formPrzegladanie_oferty. Niewiem jak to zrobić, ponieważ obrazek książki, jak i messageboxy do których należy wpisać cenę oraz tytuł są tworzone dynamicznie przyciskiem. Również przycisk odpowiadający za dodawanie książki jest stworzony dynamicznie i chciałbym jeszcze zapytać, czy do eventu można dodać jeszcze jeden argument jakim była by np. cena?

Część funkcji dodająca książkę:

Label labelCena = new Label(); labelCena.text = "123"; this.Controls.Add(labelCena); dodaj.Click += new EventHandler(this.bDodaj, labelCena ?????);

Funkcja eventu:
void bDodaj (object sender, EventArgs e, Label labelCena ????? ){};

Mogę tak zrobić? Jeśli nie, to jak to zrobić inaczej?

1

Do koszyka potrzebujesz osobną klasę, jakiś BasketManager, który na początek, dla ułatwienia Ci życia, może być singletonem. Ów manager będzie trzymał kolekcję książek oraz umożliwiał operacje na niej (dodanie, usunięcie, wylistowanie). Jeśli zaprojektujesz go jako singleton (to co prawda antywzorzec projektowy, ale początkującemu na pewno bardzo ułatwi temat), to będziesz mieć do niego z każdej innej klasy Twojej aplikacji.
Nie rozumiem, czemu chcesz zrobic dodawanie ksiażek do koszyka na eventach. Tak jest trudniej, choć lepiej. Zrób BasketManager.Instance.Add(bookInstance), gdzie bookInstance to instancja ksiażki, ktyórą chcesz dodać do koszyka (może się też nazywać bookDescription albo po prostu book).

0

Natomiast w evencie dodawanie ksiazki do koszyka skad ten event ma wiedziec o ktora ksiazke z singletonu chodzi skoro nie mam w nim zadnego argumentu ktory mowi o numerze ksiazki w klasie basket manager? Ciekawy jestem rowniez jak zaimplementowac taki singleton z funkcja add- bardzo by mi to pomogło w dalszym zrozumieniu i inne funkcje na pewno poszły by mi bez problemu.

1

Wydaje mi się że zrozumiałem o co chodzi z singletonem. Rozumiem że w funkcji dodawania nowej ksiazki ma powstawac nowy singleton

Masz rację - wydaje Ci się. Cytat powyżej dowodzi tego, bo nie ma czegoś takiego jak "nowy singleton". Singleton jest jeden per cały AppDomain.
Napisz tutaj czym według Ciebie jest singleton, chętnie spojrzę na Twój kod z zaimplementowanym tymże wzorcem.

0
niuuby napisał(a):

Natomiast w evencie dodawanie ksiazki do koszyka skad ten event ma wiedziec o ktora ksiazke z singletonu chodzi skoro nie mam w nim zadnego argumentu ktory mowi o numerze ksiazki w klasie basket manager? Ciekawy jestem rowniez jak zaimplementowac taki singleton z funkcja add- bardzo by mi to pomogło w dalszym zrozumieniu i inne funkcje na pewno poszły by mi bez problemu.

Jaki event? BasketManager.Instance.Add(new Book("Przeminęło z bitem", "Dżon Kovalsky, 199.99));. Zamiast new Book() może być jakiś już istniejący model z jakiejś listy.

0

Po dodaniu książki tworzy się również button, który po kliknięciu (event o który mi chodzi) dodaje książkę do koszyka.

BasketManager.Instance.Add(new Book("Przeminęło z bitem", "Dżon Kovalsky, 199.99));

Chciałbym umieć zaimplementować tą klasę i metody, bo bez tego nie użyje jej wywołania.

0
    public class BookModel
    {
        public string Author { get; }
        public string Title { get; }
        public decimal Price { get; } // should not be a part of book, but I added it for simplicity reasons

        public BookModel(string title, string author, decimal price)
        {
            Title = title;
            Author = author;
            Price = price;
        }
    }

    public class BasketManager
    {
        public static BasketManager Instance { get; } = new BasketManager();
        private List<BookModel> books = new List<BookModel>();
        private BasketManager() { }

        public void Add(BookModel book) => books.Add(book ?? throw new ArgumentNullException(nameof(book));
        public ICollection<BookModel> Get() => books.ToList();
        public void Clear() => books.Clear();
    }

0

Wydaje mi się, że nadal nie dostałem jednoznacznej odpowiedzi, jak dodać książkę do koszyka. Chodzi mi o kod w miejscu pytajników.
Skąd wiedzieć jaką ten button ma przypisaną książkę.```csharp

private void bDodajksiazke_Click(object sender, EventArgs e)
        {
            
            // dodawanie pictureboxa
            PictureBox pictureBox1 = new PictureBox();
            pictureBox1.Tag = "ksiazka" + (i+1).ToString();
            pictureBox1.Size = new Size(208, 162);
            pictureBox1.Location = new Point(12, counter);
            this.Controls.Add(pictureBox1);
            // dodawanie jpg ksiazki
            OpenFileDialog open = new OpenFileDialog();
            open.Filter = "Image Files(*.jpg; *.jpeg; *.gif; *.bmp)|*.jpg; *.jpeg; *.gif; *.bmp";
            if (open.ShowDialog() == DialogResult.OK)
            {
                pictureBox1.Image = new Bitmap(open.FileName);
            }

            // pictureBox1.Click += new EventHandler(this.newPB_click);


            Button dodaj = new Button();
            dodaj.Tag = "bDodaj" + (i + 1).ToString();
            dodaj.Location = new Point(473, counter); 
            dodaj.Size = new Size(93, 94);
            this.Controls.Add(dodaj);
            BookModel nowa_ksiazka = new BookModel("Tytul","Autor",10);
            dodaj.Click += new EventHandler(this.bDodajDoKoszyka);
            dodaj.Visible = true;
            counter += 168;
            i++;

        }

        void bDodajDoKoszyka(object sender, EventArgs e)
        {
            ????????????    pseudo kod: KsiążkaTegoButtona -> dodajDoKoszyka();
        }
0
BookModel book= new BookModel("w pustyni puszczy","Sienkiewicz",10.50)
basketManager.Add(book)

Taki kod pisany na szybko. Na podtsawie struktury od @ŁF

0

Natomiast skąd ten dynamiczny event ma wiedzieć jaką książkę dodać do koszyka? Samo dodanie książki nie jest problemem.

0

Nie wiem. Skąd ma wiedzieć jakie masz założenie w programie? Może po prostu dodaj trzeci argument metody, albo zczytaj wartość jakiś textboxow no nie wiem jak ma to wyglądać.

0

Jak dodaje trzeci argument do funkcji np.:

void bDodajDoKoszyka(object sender, EventArgs e, BookModel book)

to wyrzuca błąd.

Wyrzuca błąd w miejscu wywołania:

dodaj.Click += new EventHandler(this.bDodajDoKoszyka, nowa_ksiazka);
0
dodaj.Click += (s, EventArgs) => { bDodajDoKoszyka(sender, EventArgs, nowa_ksiazka); };

void bDodajDoKoszyka(object sender, EventArgs e, BookModel book)
    {
       basketManager.Add(book)
    }
0

Taki error:

screenshot-20210102221148.png

0

screenshot-20210102223501.png
Po dodaniu w odpowiednim miejscu:

0

Kompiluje się, a jeśli działa poprawnie to dziękuję bardzo za pomoc, ponieważ rozwiązany został mój największy błąd przez który stałem w miejscu. Dziękuję jeszcze raz za pomoc @Botek oraz za łopatologiczne pomaganie krok po kroku.

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