2009-12-17 5 views
7

Ho una classe personalizzata, che deriva da UserControl. Il codice:C# digitato <T> usercontrol in modalità progettazione dà errore

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

Questo classworks come dovrebbe funzionare. Ma, quando cerco di entrare in modalità di progettazione della forma che contiene questi Gallery classi, mi dà errori:

  • Impossibile trovare il tipo 'PresentrBuilder.Forms.Gallery'. Assicurarsi di fare riferimento all'assieme che contiene questo tipo. Se questo tipo è una parte del tuo progetto di sviluppo , assicurati che il progetto sia stato completato con successo .

  • La variabile 'pictureGallery' è non dichiarata o non è mai stata assegnata a .

Nota: (pictureGallery in realtà è un Gallery<PictureElement>).

Come può risolvere questo? In questo modo, non posso lavorare in modalità progettazione che rende piuttosto difficile la creazione dell'interfaccia utente.

risposta

12

Il designer odia (cioè non supporta) i controlli generici e non cambierà molto presto, quindi non farlo. Invece, si consideri avere una proprietà (o simile) che accetta uno Type, e fare un po 'di lavoro in fase di esecuzione (riflessione, ecc) - oppure: non utilizzare il designer.

Ad esempio, se si dispone di:

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

È possibile utilizzare:

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

Questo vi darà tutto quello che hanno attualmente (new, IElement, ecc) - ma è solo puo' t fare qualsiasi convalida in fase di compilazione.

+0

Sono passati cinque anni da quando è stata posta questa domanda. Qualcosa è cambiato nelle versioni più recenti di Visual Studio? – Misiu

+0

@Misiu non AFAIK –

+0

Sicuramente non perché sto avendo lo stesso identico problema ora. – nicV

11

A volte la cosa più semplice da fare in questo caso è creare una sottoclasse vuota che qualifichi il parametro generico.

Questo spesso è fatto con l'ObservableCollection:

public class SomeItemCollection : ObservableCollection<SomeItem>{ 

} 

'un po' irritante, ma può risolvere i vostri problemi.

1

Invece di avere un controllo generico, fare in modo che il controllo interagisca con una classe generica separata dal controllo stesso. Quindi passa questa classe nel controllo.

3

Come gli altri hanno dichiarato, il Visual Studio Designer ha un sacco di problemi nel gestire i generici nei controlli. Mi sono imbattuto in questo da solo quando provavo ad implementare qualcosa come una generica classe di 'visualizzatore di proprietà'.

La soluzione che ha funzionato per me è stata la definizione di una classe intermedia, come ha detto Egor.Se ho capito bene la tua domanda, per la situazione, che dovrebbe essere qualcosa di simile:

public class PictureElementGallery : Gallery<PictureElement> 

quindi utilizzare il PictureElementGallery sul modulo, invece di Galleria < PictureElement>. Il progettista non dovrebbe avere problemi con quello.

Problemi correlati