38 votes

Classe de base générique pour WinForm UserControl

J'ai créé une classe générique de base pour une WinForm UserControl:

public partial class BaseUserControl<T> : UserControl
{
    public virtual void MyMethod<T>() 
    { 
        // some base stuff here 
    }
}

Et un contrôle utilisateur basé sur:

public partial class MyControl : BaseUserControl<SomeClass>
{
    public override void MyMethod<SomeClass>() 
    { 
        // some specific stuff here 
        base.MyMethod<SomeClass>();
    }
}

Il fonctionne très bien, mais MyControl ne peuvent pas être modifiés dans le VisualStudio Concepteur, parce qu'il dit qu'il est impossible de charger la classe de base. J'ai essayé de définir une autre classe BaseUserControl, non générique, en espérant qu'il allait le charger, mais l'astuce ne semble pas fonctionner.

J'ai déjà une solution: définir une interface, IMyInterface<T>, et ensuite créer mon contrôle

public partial class MyControl : UserControl, IMyInterface<SomeClass>

Mais je perds ma base de méthodes virtuelles (pas une grosse affaire, mais quand même...).

Est-il un moyen de créer une base de classe générique pour un contrôle utilisateur, avec la possibilité de le modifier dans le VisualStudio Designer?

35voto

bernhardrusch Points 4445

Nous faisons la même chose et nous travaillons en spécialisant d'abord une classe et en dérivant de la classe spécialisée. En utilisant le code de votre exemple, cela signifie quelque chose comme:

 public partial class UserControl : UserControlDesignable 
{

...
}
public class UserControlDesignable : BaseUserControl<Someclass> { }
 

Le designer agit toujours parfois de façon floconneuse - mais la plupart du temps cela fonctionne.

14voto

Frederik Gheysels Points 36354

Vous devrez tromper le concepteur en ajoutant une classe «régulière» qui hérite de votre formulaire de base générique. Votre formulaire concevable devrait alors hériter de cette classe. Les 2 définitions de classe suivantes sont donc dans le même fichier. Vous devrez vous assurer que la classe qui hérite du contrôle utilisateur de base générique est la dernière classe du fichier.

 public MyForm : EditableCustomerForm
{}

public EditableCustomerForm : GenericForm<Customer>
{}
 

Le concepteur affichera la première classe dans le fichier de code qu'il rencontre.

3voto

yo hal Points 1949

Bien que cela semble être un bug dans Visual studio.

En creusant dans le cadre (en fait par l'ajout d'un RootDesignerSerializer avec un type dérivé de CodeDomSerializer et supérieur de l' serialize méthode), j'ai été en mesure de prouver que le VS Code Dom fournisseur est en fait l'analyse tort les classes génériques, et au lieu de le considérer comme une classe générique c'est le considérer comme une classe ordinaire avec le nom class<T>, qui Type.GetType() peut pas, bien sûr trouver.

Je suis toujours à la recherche d'un moyen de le contourner, mais dans le temps, on peut utiliser les solutions ci-dessus.

Il y a un Microsoft.Connectez rapport de bug sur, s'il vous plaît voter pour elle au https://connect.microsoft.com/VisualStudio/feedback/details/797279/win-forms-designer-error-when-inheriting-from-a-generic-form

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X