12 votes

Le concepteur Winform de Visual Studio 2008 ne parvient pas à charger un formulaire qui hérite d'une classe générique.

J'ai un projet winforms, et j'ai créé une classe sur l'assemblage A qui hérite de System.Windows.Forms.Form pour servir de classe de base pour les différents formulaires de mon projet, la classe de base est quelque chose comme :

public partial class DataForm<T> : Form where T : class
{

    T currentRecord;

    protected T CurrentRecord
    {
        get
        {
            return currentRecord;
        }
        set
        {
            currentRecord = value;
            CurrentRecordChanged();
        }
    }
}

Maintenant, lorsque je crée un formulaire sur l'assemblée B qui hérite de mon DataForm, le concepteur ne se charge pas, mais si je le compile, l'application fonctionne bien.

Le formulaire ressemble à ça :

public partial class SomeTableWindow : DataForm<SomeTable>
{
    public SomeTableWindow ()
    {
        InitializeComponent();
    }
}

L'erreur que je reçois est la suivante :

The designer could not be shown for this file because none of the classes within it can be designed. 
The designer inspected the following classes in the file: CultivosWindow --- The base
class 'TripleH.Erp.Controls.DataForm' could not be loaded. Ensure the assembly has 
been referenced and that all projects have been built.    

Instances of this error (1)  

1.   Hide Call Stack 

at System.ComponentModel.Design.Serialization.CodeDomDesignerLoader.EnsureDocument(IDesignerSerializationManager manager)
at System.ComponentModel.Design.Serialization.CodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager manager)
at Microsoft.VisualStudio.Design.Serialization.CodeDom.VSCodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager serializationManager)
at System.ComponentModel.Design.Serialization.BasicDesignerLoader.BeginLoad(IDesignerLoaderHost host)  

S'agit-il d'un bogue dans le concepteur ? ou est-ce que je fais quelque chose de mal ? Existe-t-il une solution de contournement ?

Merci pour votre aide

16voto

tster Points 9948

C'est une limitation connue. En fait, vous pouvez contourner ce problème en déclarant une autre classe qui hérite de la classe générique.

Par exemple :

class Generic<T> : UserControl
{
}

entonces

class GenericInt : Generic<int> { }

alors utilisez GenericInt au lieu de Generic. C'est con, je sais.

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