UserControl collection pas marqué comme sérialisable
Je doit manquer quelque chose de vraiment évident. Je suis tout à fait novice en C#, mais ont été la programmation en C/C++ depuis des années, donc désolé si c'EST quelque chose saute aux yeux 😉
[Voir Éditer de nouveaux problèmes]
Je suis en train de créer un nœud contenant un UserControl. J'ai le Contrôle figurant dans le WinForm designer et je peux ajouter des nœuds. Cependant lorsque j'essaie d'exécuter le code que j'obtiens l'erreur suivante:
La génération de Code pour la propriété 'Noeuds' a échoué. L'erreur était: 'Type
App.Le nœud " dans l'Assembly 'App, version=1.0.0.0, Culture=neutral,
PublicKeyToken=null " n'est pas marqué comme sérialisable.
et puis aucun des nœuds, j'ai ajouté montrer.
Cela commence à me rendre fou, aussi loin que je peux voir, il EST marqué comme sérialisable.
Le nœud est défini comme suit:
[Serializable]
public class Node : MarshalByRefObject
{
public Node()
{
}
public Node( String text )
{
this.Text = text;
this.Checked = false;
this.Complete = false;
}
public String Text { get; set; }
public bool Checked { get; set; }
public bool Complete { get; set; }
public bool Selected { get; set; }
};
J'ai ensuite définir une "Collection" comme suit:
[Serializable]
public class NodeCollection : List< Node >
{
public NodeCollection() :
base()
{
}
};
À la fois la collecte et le nœud lui-même ont la "Serializable" ensemble d'attributs comme vous pouvez le voir.
La propriété des éléments mentionnés dans l'erreur est définie comme suit
private NodeCollection mNodes = new NodeCollection();
[Category( "Behavior" )]
[Description( "Nodes" )]
public NodeCollection Nodes
{
get
{
return mNodes;
}
}
Donc, quiconque a une idée de ce que je fais mal?
Edit: En réponse à Archeg les commentaires c'est mon UserControl:
public partial class Control : UserControl
{
public Control()
{
InitializeComponent();
}
protected override void OnPaint( PaintEventArgs pe )
{
Graphics graph = pe.Graphics;
int rowHeight = Font.Height + 2;
if ( Nodes != null )
{
int yPos = 0;
foreach( Node node in this.Nodes )
{
//Calculate my various bounding boxes.
Rectangle nodeBounds = new Rectangle( Bounds.Left, yPos, Bounds.Width, rowHeight );
Rectangle lightBounds = new Rectangle( Bounds.Right - Font.Height, yPos, rowHeight, rowHeight );
Rectangle spannerBounds = new Rectangle( lightBounds.Left - Font.Height, yPos, rowHeight, rowHeight );
Rectangle checkBoxBound = new Rectangle( 32, yPos, rowHeight, rowHeight );
Rectangle textBounds = new Rectangle( checkBoxBound.Right, yPos, Bounds.Width - (rowHeight * 2) - checkBoxBound.Right, rowHeight );
//Draw selection box.
Brush textColour = Brushes.Black;
if ( node.Selected )
{
graph.FillRectangle( Brushes.Blue, nodeBounds );
textColour = Brushes.Yellow;
}
//Draw node text.
graph.DrawString( node.Text, Font, textColour, textBounds );
//Draw Red/Green light
Image[] lightImages = new Image[] { CompleteLightImage, InCompleteLightImage };
Image lightImage = lightImages[node.Complete ? 1 : 0];
if ( lightImage != null )
{
graph.DrawImage( lightImage, lightBounds );
}
//Draw Spanner Icon
if ( SettingsImage != null )
{
graph.DrawImage( SettingsImage, spannerBounds );
}
//Draw check box.
VisualStyleRenderer renderer = null;
VisualStyleElement ve = node.Checked ? VisualStyleElement.Button.CheckBox.CheckedPressed : VisualStyleElement.Button.CheckBox.CheckedNormal;
if (VisualStyleRenderer.IsElementDefined( ve ))
{
renderer = new VisualStyleRenderer( ve );
}
if ( renderer != null )
{
renderer.DrawBackground( graph, checkBoxBound );
}
else
{
ControlPaint.DrawCheckBox( graph, checkBoxBound, node.Checked ? ButtonState.Checked : ButtonState.Normal );
}
yPos += Font.Height;
}
}
}
private NodeCollection mNodes = new NodeCollection();
[Category( "Behavior" )]
[Description( "Nodes" )]
[DesignerSerializationVisibility( DesignerSerializationVisibility.Content )]
[MergableProperty( false )]
[Bindable( false )]
public NodeCollection Nodes
{
get
{
return mNodes;
}
}
public Image CompleteLightImage { get; set; }
public Image InCompleteLightImage { get; set; }
public Image SettingsImage { get; set; }
}
J'ai fait quelques modifications depuis que j'ai posté généralement relatives à la "DesignerSerializationVisibility" attribut qui a aidé, mais je suis maintenant l'erreur de génération suivante:
erreur MSB3103: Invalid fichier Resx. Impossible de charger le type d'Application.Nœud, App,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null, qui est utilisé dans
l' .Fichier RESX. S'assurer que les références ont été ajoutées
pour votre projet.
Edit 2: il est intéressant de noter que mes problèmes se produisent uniquement lorsque j'ai ajouter un groupe de Nœuds dans le concepteur puis-je obtenir la ci-dessus Resx erreur. Si j'ajoute les nœuds manuellement à partir de code alors qu'il fonctionne tout comme je m'attends à ...
Yup son totalement personnalisé, directement dérivé de UserControl
Vous pouvez poster votre code UserControl?
Ajout d'un code et légèrement mis à jour avec mes dernières questions ...
OriginalL'auteur Goz | 2012-03-20
Vous devez vous connecter pour publier un commentaire.
Je crois que vous avez ce problème, car le Concepteur tente automatiquement de sérialiser tous les publics les propriétés UserControl. Si cette propriété n'est pas nécessaire pour la réalisation de votre UserControl moment de la conception de soutien, alors vous pouvez Ajouter des "DesignerSerializationVisibility" attribut:
ou tout simplement omettre le
get{}
etset{}
méthodes de la propriété et de l'utiliser comme un champ public.Espère que cela aide!
OriginalL'auteur Rzassar
Qui est très étrange. J'en ai reproduit localement sur ma note, puis déplacé classe de Nœud à un autre projet et ça a fonctionné. Je pense que c'est quelque chose avec dépendances circulaires - il essaie de trouver votre assemblée (dans mon cas c'était WindowsFormsApplication1) construit, mais il ne peut pas car il est en construction en ce moment.
Espère que vous aider, et je vais essayer de creuser plus loin.
Mise à jour
Une autre façon de le résoudre: supprimer [Sérialisation] attribut de la classe de Nœud. Dans ce cas, vous force VS au lieu de générer Nœud contenu dans le fichier resx, il vous suffit de créer un tel code:
Ajouté un supplément de modifier dans la partie inférieure. Fondamentalement, le problème, c'est que quelque chose se passe mal avec le designer ... je ne sais pas si cela vous aide à tous
Yep, semble que VS ne parvient pas à générer de sérialisation de données sur le contrôle du bâtiment. U ne dérange si je poste ça comme un bug de Microsoft, que je n'ai pas été en mesure de trouver quelques significatif explication?
Je ne sais pas comment je n'ai pas réussi à repérer que la mise à jour ... mais oui, je veux vraiment être en mesure d'utiliser le concepteur de ...
Si vous pensez qu'il va faire toute la différence, aller de fer (IME vous devez être titulaire d'un MS employé en personne pour obtenir toute utilisation en dehors des rapports de bug ;))
OriginalL'auteur Archeg