2008-09-20 7 views
0

J'ai sous-classé Form pour inclure des fonctionnalités supplémentaires, qui se résument à un List<Image> qui s'affiche dans un ensemble de points prédéfinis sur le formulaire. Je donne les résultats suivants:Le formulaire sous-classé ne se comporte pas correctement en mode Designer (VS 2008)

public class ButtonForm : Form 
{ 
    public class TitleButton 
    { 
     public TitleButton() { /* does stuff here */ } 
     // there's other stuff too, just thought I should point out there's 
     // a default constructor. 
    } 

    private List<TitleButton> _buttons = new List<TitleButton>(); 
    public List<TitleButton> TitleButtons 
    { 
     get { return _buttons; } 
     set { _buttons = value; } 
    } 
    // Other stuff here 
} 

Alors ma forme réelle que je veux utiliser est une sous-classe de ButtonForm au lieu de Form. Tout fonctionne très bien, Designer récupère même la nouvelle propriété et l'affiche sur la liste des propriétés. Je pensais que ce serait génial! Il a montré la collection, je pourrais ajouter les boutons là-bas et loin j'irais. J'ai donc ouvert l'éditeur de collection, ajouté dans tous les objets, et voici, assis là dans le concepteur était une image parfaite de ce que je voulais.

C'est là que ça commence à devenir moche. Pour une raison ou pour une autre, Designer refuse de générer du code pour créer les objets et les attacher à la collection, alors qu'en apparence, en mode Design, dès que je le compile et l'exécute, tout disparaît à nouveau et je suis de retour à la case un. Je suis complètement perdu quant à la raison pour laquelle cela arriverait; Si le concepteur peut le générer assez bien pour obtenir une image parfaite de mon formulaire avec le comportement supplémentaire, pourquoi ne peut-il/ne va-t-il pas générer le code dans le fichier de code réel?

Répondre

3

Tout d'abord, vous devez hériter de votre classe TitleButton de Component pour que le concepteur sache qu'il s'agit d'un composant qui peut être créé via du code généré par le concepteur. Ensuite, vous devez demander au générateur de code du concepteur de travailler sur le contenu de la collection et non sur l'instance de la collection elle-même. Donc, essayez ce qui suit ...

public class TitleButton : Component 
{ 
    // ... 
} 

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
public List<TitleButton> TitleButtons 
{ 
    // ... 
} 
+0

Eh bien, c'était incroyablement simple ... Merci beaucoup. Vous semblez être mon sauveur personnel dernièrement: D –

+0

Quelque chose m'énerve encore à ce sujet ... Si on doit lui dire que c'est un composant avec lequel il peut travailler, pourquoi cela fonctionnera-t-il de toute façon et ensuite seulement pas écrire de code? –

Questions connexes