2008-11-25 5 views
1

Je suis en train de créer un formulaire utilisateur .Net en utilisant C# et je le remplis de commandes utilisateur personnalisées. Les contrôles ont chacun un accesseur qui obtient et définit l'objet qui contient les données que le contrôle sera rempli.Construction de contrôles utilisateur .Net

Lors de l'exécution, tout fonctionne très bien, mais au moment de la conception, j'obtiendrai des erreurs dans le concepteur de formulaires. Les erreurs sont toujours sur les lignes de "Impossible de convertir un objet de type [ObjectA] en un objet de type [ObjectA]"

À ce stade, je peux aller dans le fichier resx et supprimer la ligne qui fait référence à l'objet de type ObjectA, puis allez dans le fichier designer.cs et supprimez la ligne dans InitializeComponent qui définit l'accesseur du contrôle sur les données du fichier resx.

Une fois cela fait, le formulaire s'affiche dans le concepteur jusqu'à ce qu'il reconstruise le InitializeComponet et réinsère les lignes/données dans le resx et InitializeComponent.

Qu'est-ce qui me manque dans le contrôle et la conception de classe qui mettra fin à ce cycle? J'ai essayé d'utiliser le mode d'utilisation de Liscence et le mode d'exécution de Designer avec des résultats mitigés et je préférerais que je puisse résoudre ce problème dans ma conception.

Merci pour toute aide que vous pouvez fournir.

Mise à jour: « ObjectA est nul, ce n'est pas autorisé » J'ai ajouté l'attribut ...

[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 

à la propriété et je suis une erreur dans le concepteur, alors j'ai changé la ligne. ..

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 

et le problème est parti. Comme je n'ai pas besoin de définir l'une de ces propriétés au moment du design, l'attribut caché est probablement plus approprié.

Merci.

Répondre

2

Il semble que cela puisse être la manière dont l'objet est sérialisé.

Le concepteur effectue une sérialisation binaire de l'objet dans le fichier resx, ce dont vous avez probablement besoin est le code à produire dans votre fichier .Designer.cs.

Essayez de mettre la ligne d'attribut suivant sur la propriété: [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]

0

Voici un exemple de code prenant en compte la conception du temps dans un contrôle utilisateur:

protected override void OnPaintBackground(PaintEventArgs e) 
{ 
    if (this.DesignMode) 
    { 
     base.OnPaintBackground(e); 
    } 
} 

Cela ne fonctionne pas pour vous, mais si vous envelopper de code problématique dans un « if (** * * this.DesignMode) {} "block, ça devrait aller (à moins que vous ayez besoin de ce code pour que le contrôle soit rendu correctement en mode design).

Questions connexes