Comment créer une propriété de contrôle utilisateur de type Collection & lt; MyClass & gt; modifiable dans le concepteur de formulaires?
Aujourd'hui, au travail, je suis tombé sur un problème qui a été me rend fou.
Fondamentalement, mon objectif est: est-ce
J'ai un UserControl1
avec un champ de type Collection<Class1>
et une propriété correspondante Collection<Class1> Prop
. Comme ceci:
public class UserControl1 : UserControl
{
private Collection<Class1> field = null;
//later changed to:
//private Collection<Class1> field = new Collection<Class1>();
[Category("Data")]
[DefaultValue(null)]
[Description("asdf")]
public Collection<Class1> prop
{
get { return field; }
set { field = value; }
}
}
//later added:
//[Serializable]
public class Class1
{
private bool booltest; public bool Booltest { get...set...}
private int inttest; public int Inttest { get...set...}
}
Si vous savez déjà ce que j'ai foiré: pas besoin de lire le reste. je vais vous décrire exactement ce que j'ai fait.
Maintenant j'ai mis le UserControl
sur aléatoires de la Forme et de changer le Prop
de la propriété. Générique de la Collection "l'Éditeur" s'affiche, comme celui utilisé pour les colonnes et les groupes dans un contrôle listview. Je peux entrer des données comme prévu. Cependant, lorsque je clique sur OK, les données ont disparu.
Il m'a fallu plus d'heure pour comprendre que j'ai fait pour instancier mon domaine: private Collection<MyClass> field = new Collection<MyClass>();
. Très bon, seulement que le concepteur est entré superspazzing mode. Une cascade de cauchemar message d'erreur qui peut être réduite à: "Vous devez mettre [Serializable]
avant votre Class1
." Après avoir fait cela je pourrais mettre mon UserControl1
sur le Formulaire à nouveau.
Mais qui ne fonctionne qu'une fois. Lors de l'ouverture de la designer de la Forme où je utiliser le UserControl1
après l'édition de quelque chose, il me donne une erreur:
Object of type 'userctltest.Class1[]' cannot be converted to type 'userctltest.Class1[]'.
Bien. La Liste des Erreurs, dit:
Warning: ResX file Object of type 'userctltest.Class1[]' cannot be converted to type 'userctltest.Class1[]'. Line 134, position 5. cannot be parsed.
Le concepteur tente d'extraire de la Propriété des données à partir du fichier resx. En supprimant le fichier resx "résout" que exactement une fois.
Le Formulaire peut maintenant être affiché à nouveau, avec mon UserControl1
. La Collection de propriété est modifiable, et il est sauvé. Il fonctionne réellement. Une fois que. Chaque fois que je change quelque chose et puis essayez d'ouvrir le Formulaire de créateurs encore une fois, l'erreur ci-dessus se produit à nouveau. Je peux supprimer le fichier resx, mais ce sera bien sûr également supprimer mes données.
Ressources pertinentes qui m'ont aidé jusqu'à présent (parmi une tonne de pas si utile les résultats de la recherche):
http://www.codeproject.com/Answers/190675/Usercontrol-with-custom-class-property#answer1
http://www.codeproject.com/KB/cs/propertyeditor.aspx
http://www.csharpfriends.com/Articles/getArticle.aspx?articleID=94
http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable.aspx
(J'ai aussi essayé la mise en œuvre de ISerializable et dominante GetObjectData avec
{ info.AddValue("testbool", testbool); info.AddValue("testint", testint); }
n'a pas aidé non plus (j'ai aussi essayé la propriété des noms au lieu des noms de champ))
Désolé pour l'écriture de cette comme un mauvais roman d'horreur, btw.
source d'informationauteur dialer
Vous devez vous connecter pour publier un commentaire.
Ce que vous voulez, c'est un moment de la conception de support avec CodeDom de sérialisation. Vous n'avez pas besoin
SerializableAttribute
ouISerializable
ceux-ci sont pour la sérialisation binaire.Puisque vous voulez sérialiser la collection, vous devez dire le concepteur de sérialiser en tant que tel. Ce qui est fait avec le DesignerSerializationVisibiliby attribut - valeur de
Content
dit le concepteur de sérialiser propriété du contenu plutôt que la propriété elle-même. Contenu de la propriété doit bien sûr être CodeDom serializable, où de simples classes avec de simples propriétés par défaut.Donc, si vous changez votre
UserControl1
classe comme ceci:... ça devrait faire l'affaire. Oh, et les propriétés de collection ne sont généralement pas accessible en écriture, mais ce n'est pas obligatoire. Mais sérialiseur attend de la collection de la propriété d'être initialisé, c'est pourquoi vous avez eu à ajouter de l'initialisation du champ.
Une autre note, si vous ne voulez pas que votre propriété est marqué en gras dans l'éditeur de propriétés, vous pouvez spécifier un système complexe de "valeur par défaut" grâce à une méthode spéciale
ShouldSerializePropertyName
, qui peut même être privé. Comme:Maintenant votre propriété ne seront en gras quand il n'est pas vide. Mais je m'égare, ce n'était pas une question 🙂
Le parfait exemple est: est-ce
Il suffit de changer
Collection<>
àList<>