[VC# 2008EE] Problem z własnymi kontrolkami

0

Niedawno zacząłem zabawę z językiem C#.. ale do rzeczy, opiszę po prostu co robię i jaki rezultat otrzymuję.
Mam solution z kilkoma formami, dodaje do tego samego projektu user control, układam na niej kilka kontrolek, dodaję parę funkcji, zapisuję. Tutaj wszystko jest ok, projekt kompiluje się bez błędów, kontrolka pojawia sie w toolboksie.

Teraz dodaję swoją kontrolkę na kilka form, kompiluję, uruchamiam, wszystko jest OK.

Jednak gdy otwieram w designerze jakąś formę zawierającą moją kontrolkę, dzieją się cuda, najpierw pojawia się informacja o błędzie.

Object reference not set to an instance of an object.
The variable 'wyborNazwy1' is either undeclared or was never assigned.

Mogę przejść do kodu, gdzie jest niby ten błąd, w kodzie jest:

this.Controls.Add(this.wyborNazwy1);

Teoretycznie możliwe gdyby nie to, że kilka linijek kodu wyżej jest:

this.wyborNazwy1 = new Projekt.WyborNazwy();

Pomijając fakt, że pomiędzy tymi dwoma linijakmi jest jeszcze kilka innych odwołujących się do wyborNazwy1 bez żadnego problemu.
Mogę ten błąd zignorować i czasem nawet designer otworzy się poprawnie. Jednak jest to denerwujące i nie zawsze działa.
Spotkaliście się kiedyś z czymś takim?

// edit
Hm. Wygląda na to, że VC# jakby prekompiluje kontrolkę. Widzę, że bruzdzi mi metoda, która wywoływana jest z konstruktora i odwołuje się do bazy danych. Czyli tak jakby IDE wywoływało konstruktor, on wywoływał moją metodę a ona sypała się nie mogąc połączyć się z bazą danych. Dobrze dedukuje? :-)

0

I tu zapewne masz rację.. Tylko po co dokładać połączenie z bazą danych w konstruktorze kontrolki? Idea jest taka, że dołożona kontrolka na formę ma nic nie robić bez ingerencji programisty, po prostu ma sobie być i zajmować miejsce.
Co za tym idzie, myślę, że powinieneś dodać jakieś zdarzenie/metodę, np. OnInitialize, która będzie się zajmowała połączeniem z bazą, a którą będziesz wywoływał np. w Form_Load, już samodzielnie :)

0

No właśnie usiadłem na spokojnie i doszedłem do takiego samego wniosku. Po prostu po kilku latach programowania w C++ i przyzwyczajenia do tego języka i różnych środowisk zaskoczyła mnie "inteligencja" VC#, nie spodziewałem się, że kontrolki widziane w designerze są skompilowane i reagują na zdarzenia. :-)

0

Dodam, że jak zaimplementujesz interfejs ISite (trochę nietrafiona nazwa :/, nie mogłem sobie jej przypomnieć) to będziesz mógł określić czy kontrolka działa w designerze, czy w run-time. Miałem bardzo podobną sytuację i rozwiązałem problem przy pomocy właśnie ISite.

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