2009-11-21 10 views
14

Mam wywołanie metody w konstruktorze mojej kontroli użytkownika, który robi coś, co nie będzie działać w czasie projektowania (połączenie z bazą danych), a Visual Studio po prostu bailed się, gdy próbowałem dodać tę kontrolę do projektanta GUI.
Oczywiście, mogę zaklasyfikować ten kod do oddzielnej metody, ale nie podoba mi się pomysł, że za każdym razem, gdy używam tego obiektu, muszę pamiętać o wykonaniu pewnej metody, która jest niezbędna dla funkcji tego obiektu (to Konstruktor jest dla!).Jak uzyskać kod w konstruktorze, który NIE zostanie wykonany w czasie projektowania przez Visual Studio?

Czy istnieje coś takiego jak symbol preprocesora, że ​​mogę oznaczyć mój kod, aby program Visual Studio nie próbował wykonać tego kodu w czasie projektowania?

+0

Czy to dobry projekt? IMO, nie powinno się robić zbyt wiele (łączenie z bazą danych, w twoim przypadku) w konstruktorze. Chciałbym zobaczyć, co mają do powiedzenia eksperci. – shahkalpesh

Odpowiedz

26

Jak inni stwierdzili, można użyć właściwości klasy ComponentDesignMode. Jednak nie będziesz mógł tego zrobić w konstruktorze swojej kontroli. Właściwość DesignMode jest zawsze false w konstruktorze i metodach wywoływanych przez konstruktor. Aby obejść ten problem, ponownie przeanalizuj swój kod, aby połączyć się z bazą danych w ramach oddzwaniania OnLoad(). Właściwość DesignMode jest ważna w tym momencie. Aby znaleźć uzasadnienie, zobacz here (poszukaj w sekcji DesignMode tego artykułu).

Właśnie natknąłem się na ten blog entry, który opisuje, jak używać właściwości System.ComponentModel.LicenseManager.UsageMode, aby zrobić to samo. Blog opisuje dodatkowe wady właściwości DesignMode, gdy mamy do czynienia z zagnieżdżonymi kontrolkami. Najwyraźniej właściwość UsageMode nie ma takich wad i jest dostępna do użycia w konstruktorze. Nie mogę osobiście ręczyć za to, ale warto byłoby się przyjrzeć.

+0

Opublikowany przez Ciebie blog działa doskonale dla mnie! (przynajmniej do tej pory) – polyglot

+0

Dobrze wiedzieć. Mogę wykorzystać tę technikę następnym razem, gdy potrzebuję niestandardowego sterowania. –

+6

Blog jest już martwy, ale w zasadzie jest po prostu: 'if (System.ComponentModel.LicenseManager.UsageMode == System.ComponentModel.LicenseUsageMode.Designtime) – Gareth

10

W Windows Forms?

if (!DesignMode) 
{ 
    // code that shouldn't be executed at design time 
} 

Jak wspominali inni, to nie zadziała w konstruktorze. Jest często używany w wydarzeniu Form.Load.

+3

Genialny, dokładnie w tym samym czasie X-) –

+0

Szybko i prosto do rzeczy! Spodziewałem się jakiegoś symbolu preprocesora, ponieważ nie wpłynie to na program po kompilacji, ale wpływ tego małego czeku jest oczywiście minimalny;) – polyglot

+2

proszę być ostrożnym! Właściwość DesingMode ma kilka problemów, które należy wziąć pod uwagę. Można znaleźć artykuł tutaj: http://weblogs.asp.net/fmarguerie/archive/2005/03/23/395658.aspx – Beatles1692

0

Podobało mi się podejście Michaela Petrotty do Windows Forms. Jeśli ktoś chce zastosować tę samą technikę do WPF, po prostu użyj IsInDesignMode.

Przykład:

public SomeViewModel() 
{ 
    if (!IsInDesignMode) 
    { 
     DoWork(); 
    } 
} 
0
public SomeViewModel() 
{ 
    if (!IsInDesignMode) 
    { 
     DoWork(); 
    } 
} 

Ten kod powyżej, jeśli pracujesz na rzeczywistej UI, które starają się pracować. W sytuacji, w której masz coś takiego na formancie, po przełączeniu się z powrotem do projektanta dla tej kontroli jest ok i nie ma błędu czasu projektowania. Teraz, jeśli dodałeś formant, który zawiera powyższy kod, do innego Formu lub innego formantu poprzez przeciągnięcie go z przybornika, pokaże to kilka błędów czasu projektowania.

Powiązane problemy