2009-12-17 14 views
7

Mam niestandardową klasę, która pochodzi od UserControl. Kod:C# wpisane <T> Kontrola użytkownika w trybie projektowania daje błąd

public partial class Gallery<T> : UserControl where T : class, IElement, new() 

This classworks jak to ma działać. Ale gdy próbuję wejść do trybu projektowania formularza, który zawiera te Gallery klas, daje mi błędy:

  • Nie można znaleźć typu „PresentrBuilder.Forms.Gallery”. Należy się upewnić, że odwołano się do zespołu , który zawiera ten typ. Jeśli ten typ jest częścią projektu deweloperskiego , upewnij się, że projekt został pomyślnie zakończony: .

  • Zmienna "pictureGallery" jest niezadeklarowana lub nigdy nie została przypisana .

Uwaga: (pictureGallery faktycznie jest Gallery<PictureElement>).

Jak rozwiązać ten problem? W ten sposób nie mogę pracować w trybie projektowania, co znacznie utrudnia tworzenie interfejsu użytkownika.

Odpowiedz

12

Projektant nie znosi (tzn. Nie obsługuje) ogólnych elementów sterujących, a to nie zmieni się w najbliższym czasie, więc nie rób tego. Zamiast tego należy rozważyć posiadanie właściwości (lub podobnej), która akceptuje numer Type i wykonanie pewnych czynności w środowisku wykonawczym (odbicie itp.) - lub: nie należy używać projektanta.

Na przykład, jeśli masz:

public Type ControlType {get;set;} // comparable to T in the original 

Można użyć:

IElement el = (IElement) Activator.CreateInstance(ControlType); 

ten daje wszystko masz aktualnie (new, IElement, etc) - ale to tylko możliwe” t wykonać jakąkolwiek walidację podczas kompilacji.

+0

Minęło pięć lat od zadawania tego pytania. Czy coś zmieniło się w nowszych wersjach Visual Studio? – Misiu

+0

@Misiu nie AFAIK –

+0

Zdecydowanie nie dlatego, że mam teraz dokładnie ten sam problem. – nicV

11

Czasami najłatwiejszą rzeczą do zrobienia w tym przypadku jest utworzenie pustej podklasy, która kwalifikuje parametr ogólny.

Często jest to zrobić z ObservableCollection:

public class SomeItemCollection : ObservableCollection<SomeItem>{ 

} 

To niby irytujące, ale może rozwiązać swoje problemy.

1

Zamiast mieć kontrolę ogólną, należy kontrolować interakcję z klasą ogólną, która jest oddzielona od samej kontrolki. Następnie przenieś tę klasę do kontroli.

3

Tak jak napisali inni, Visual Studio Designer ma wiele problemów z obsługą generycznych elementów sterujących. Wpadłem na to sam, próbując zaimplementować coś w rodzaju ogólnej klasy "przeglądarka właściwości".

Rozwiązaniem, które zadziałało, było zdefiniowanie klasy pośredniej, jak powiedział Egor.Jeśli dobrze rozumiem pytanie, do sytuacji, że powinno być coś takiego:

public class PictureElementGallery : Gallery<PictureElement> 

Następnie użyj PictureElementGallery na formularzu, zamiast Galerii < PictureElement>. Projektant nie powinien mieć z tym problemu.

Powiązane problemy