Zmiana właściwości komponentu na innej formie

0

Chcę przyciskiem z jednej formy zmienić wartość Labela na innej formie (w obrębie tego samego programu). Kompilator (Visual Studio) napisał mi, że Label musi być "static" żebym mógł mieć do niego dostęp. Poprawiłem więc deklarację Labela na static i zadziałało. Moja radość nie trwała długo, ponieważ VS ciągle sam poprawia mi typ Labela na nie-static. Co zrobić, żeby kompilator nie cofał moich poprawek w kodzie?

0

takie rzeczy należy robić przez eventa.

1

Twoje "static" wstawione przy deklaracji Labela usuwa designer Visual Studio. Tworzy on kod zgodnie z pewnymi zasadami, które chcesz złamać. Na szczęście, jest na tyle uparty, że poprawi wszystko to, co chcesz zepsuć.

Label nie ma prawa być static, bo jest elementem Formy. Po obiektowemu Label jest polem obiektu klasy Form.
Gdyby Label był static byłby polem wspólnym dla wszystkich obiektów klasy Form. Jaki to miałoby sens? Jak element Formy miałby być elementem wspólnym dla wszystkich formularzy? To tak, jakby wszyscy ludzie na świecie mieli jedną lewą nogę - bez sensu, prawda?

Musisz przemyśleć projekt swojej aplikacji i zamiast zmieniać coś na Labelu innej formy bezpośrednio, udostępnić w niej jakąś metodę, do której odwołasz się z innej formy. Oczywiście te dwie formy muszą być w takiej sytuacji powiązane (np. jedna przyjmować w konstruktorze drugą). (To jest oczywiście najprostsze rozwiązanie takiego problemu.)

0

somekind ma racje, warto przemyśleć projekt. Natomiast żeby zrobić to, co chcesz kliknij na twój Label, potem nacisnij F4, odszukaj właściwość Modifiers i ustaw wartość tego property na public. Wtedy do tego labela z poziomu innej klasy dostaniesz się np tak : frmMyForm.Label.Text = "abc";

pzdr
squash

0

W sumie mam tylko 1 instancję obiektu klasy Form1, więc pomyślałem, że powinno to przejść.

Squash napisał(a)

somekind ma racje, warto przemyśleć projekt. Natomiast żeby zrobić to, co chcesz kliknij na twój Label, potem nacisnij F4, odszukaj właściwość Modifiers i ustaw wartość tego property na public. Wtedy do tego labela z poziomu innej klasy dostaniesz się np tak : frmMyForm.Label.Text = "abc";

pzdr
squash

W tym problem, że Modifiers mam ustawione na public, ale i tak z innej klasy jest to niewidoczne :|
W C# robię coś dopiero od kilku dni. Wcześniej używałem Delphi (niestety z powodu nieciekawej polityki firmy Embarcadero byłem zmuszony zmienić język programowania) i tam wystarczyło dodać formę do uses i wszystko grało. A tutaj jednak jest trochę inna filozofia. Pewnie trochę czasu minie zanim to opanuję...

0
Pociech napisał(a)

W tym problem, że Modifiers mam ustawione na public, ale i tak z innej klasy jest to niewidoczne :|

Na pewno jest widoczne. Tylko pewno próbujesz się odwołać się przez Form1.labelJakiśTam czyli statycznie, zamiast przez nazwaObiektuForm1.labelJakiśTam.

Tu nie ma filozofii tylko programowanie obiektowe.

0

Racja, dopiero teraz zauważyłem, że Form1 nie ma jawnej nazwy obiektu, bo jest Application.Run(new Form1()); Czyli z tego co rozumiem nie mam się do czego odwołać. Poradziłem sobie z problemem dodając do kreatora Form2 jako parametr referencję do odpowiedniego Labela.

0

To jest niechlujne, łamie chociażby zasadę hermetyzacji. Zdecydowanie lepiej by było, żeby Form2 przyjmował w konstruktorze Form1, przechowywał go w jakimś polu, a potem wywoływał metodę, która dopiero ustawi tekst na Labelu.

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