Odwołanie do klas innej formy.

Odwołanie do klas innej formy.
NI
  • Rejestracja:ponad 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:16
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

ŁF
Moderator
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 16 godzin
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).


edytowany 1x, ostatnio: ŁF
NI
  • Rejestracja:ponad 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:16
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.

NI
  • Rejestracja:ponad 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:16
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?

edytowany 1x, ostatnio: niuuby
ŁF
Moderator
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 16 godzin
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).


AK
Dokładnie. Mówiąc łopatologicznie, oddzielić dane / magazyn danych od GUI
NI
  • Rejestracja:ponad 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:16
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.

edytowany 1x, ostatnio: niuuby
ŁF
Moderator
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 16 godzin
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.


NI
To prawda, w tamtym momencie źle zrozumiałem, ale szukałem dalej i już wiem, że singleton oznacza, że jest tylko jeden obiekt. Natomiast proszę o odpowiedź na zedytowane pytanie.
ŁF
Moderator
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 16 godzin
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.


NI
  • Rejestracja:ponad 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:16
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.

ŁF
Co stoi na przeszkodzie?
ŁF
Moderator
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 16 godzin
0
Kopiuj
    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();
    }


NI
  • Rejestracja:ponad 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:16
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

Kopiuj
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();
        }
edytowany 1x, ostatnio: niuuby
GO
W obszarze pisania postu, obok ikonek bolta czy italicy, na prawo od znacznika kodu masz znacznik który formatuje kod według języka. Wybierz C# i upewnij się, że cały kod znajduje się w znaczniku.
BO
  • Rejestracja:około 6 lat
  • Ostatnio:dzień
  • Postów:214
0
Kopiuj
BookModel book= new BookModel("w pustyni puszczy","Sienkiewicz",10.50)
basketManager.Add(book)

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

edytowany 2x, ostatnio: Botek
NI
  • Rejestracja:ponad 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:16
0

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

BO
  • Rejestracja:około 6 lat
  • Ostatnio:dzień
  • Postów:214
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ć.

edytowany 1x, ostatnio: Botek
NI
  • Rejestracja:ponad 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:16
0

Jak dodaje trzeci argument do funkcji np.:

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

to wyrzuca błąd.

Wyrzuca błąd w miejscu wywołania:

Kopiuj
dodaj.Click += new EventHandler(this.bDodajDoKoszyka, nowa_ksiazka);
edytowany 1x, ostatnio: niuuby
BO
  • Rejestracja:około 6 lat
  • Ostatnio:dzień
  • Postów:214
0
Kopiuj
dodaj.Click += (s, EventArgs) => { bDodajDoKoszyka(sender, EventArgs, nowa_ksiazka); };

void bDodajDoKoszyka(object sender, EventArgs e, BookModel book)
    {
       basketManager.Add(book)
    }
edytowany 5x, ostatnio: Botek
Zobacz pozostałe 3 komentarze
BO
Jeszcze button na swoją nazwę musisz zmienić.
NI
A co to jest buttonNext_Click?
BO
U ciebie bDodajDoKoszyka.
NI
Rozumiem, a ta pierwsza linijka ma być zamiast którejś u mnie? I w funkcji private void bDodajksiazke_Click?
BO
dodaj.Click += new EventHandler(this.bDodajDoKoszyka); -to ma być pierwsza linia
NI
  • Rejestracja:ponad 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:16
0

Taki error:

screenshot-20210102221148.png

BO
sender musisz zmienić na coś innego np. na s ponieważ ,sender już jest parametrem tej metody.
NI
w którym miejscu, bo dużo tych senderów. Natomiast nieważne gdzie zmienię- nadal błąd.
NI
  • Rejestracja:ponad 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:16
0

screenshot-20210102223501.png
Po dodaniu w odpowiednim miejscu:

BO
Ta linia jest zbędna masz w jej miejsce nową.
NI
  • Rejestracja:ponad 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:16
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.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)