2009-12-17 10 views
7

Tengo una clase personalizada, que se deriva de UserControl. El código:C# mecanografiado <T> usercontrol en modo de diseño da error

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

Este Classworks como se supone que debe trabajar. Sin embargo, cuando intento entrar en el modo de diseño de la forma que contiene estos Gallery clases, me da errores:

  • No se pudo encontrar el tipo 'PresentrBuilder.Forms.Gallery'. Asegúrese de que se hace referencia al conjunto que contiene este tipo. Si este tipo es una parte de su proyecto de desarrollo , asegúrese de que el proyecto haya sido exitosamente construido .

  • La variable 'pictureGallery' no está declarada o nunca fue asignada.

Nota: (pictureGallery realidad es una Gallery<PictureElement>).

¿Cómo se puede solucionar esto? De esta manera, no puedo trabajar en modo de diseño, lo que hace que la creación de mi interfaz de usuario sea bastante difícil.

Respuesta

12

El diseñador detesta (es decir, no admite) los controles genéricos, y eso no va a cambiar pronto, así que no lo haga. En su lugar, considere tener una propiedad (o similar) que acepte un Type, y hacer algún trabajo en el tiempo de ejecución (reflexión, etc.) - o: no use el diseñador.

Por ejemplo, si usted tiene:

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

que puede utilizar:

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

Esto le dará todo lo que tiene actualmente (new, IElement, etc) -, pero sólo puede' Hacer cualquier validación en tiempo de compilación.

+0

Han pasado cinco años desde que se hizo esta pregunta. ¿Algo cambió en las versiones más nuevas de Visual Studio? – Misiu

+0

@ Misiu no AFAIK –

+0

Definitivamente no es porque estoy teniendo exactamente el mismo problema ahora. – nicV

11

A veces lo más fácil de hacer en este caso es crear una subclase vacía que califique al parámetro genérico.

Esto se hace a menudo con el ObservableCollection:

public class SomeItemCollection : ObservableCollection<SomeItem>{ 

} 

Es un poco irritante, pero puede resolver sus problemas.

1

En lugar de tener un control genérico, haga que el control interactúe con una clase genérica que está separada del control en sí. Luego pasa esta clase al control.

3

Como han dicho los otros, el Visual Studio Designer tiene muchos problemas para manejar los genéricos en los controles. Me he encontrado con esto al tratar de implementar algo así como una clase genérica de "visor de propiedades".

La solución que funcionó para mí fue la definición de una clase intermedia, como dijo Egor.Si entiendo bien su pregunta, por su situación, eso debería ser algo como esto:

public class PictureElementGallery : Gallery<PictureElement> 

continuación, utilizar el PictureElementGallery en su forma, en lugar de Galería < PictureElement>. El diseñador no debería tener problemas con eso.