Question

Comment ajouter le EditorAttribute (éditeur) à la propriété d'un objet à l'exécution?

Je My.Settings.ExcludeFiles, qui est créé par le concepteur de paramètres comme Public Property ExcludedFiles() As Global.System.Collections.Specialized.StringCollection. Lors de l'édition ExcludedFiles via une grille de propriété, la "String Collection Editor" génère un "Constructor du type 'System.String' not found" run-time exception.

Je ne peux pas modifier les attributs de la propriété ExcludeFiles car ils seront remplacés la prochaine fois que les modifications de réglage sont faits. Par conséquent, je dois joindre / ajouter l'éditeur / EditorAttribute lors de l'exécution.

Ce que je veux faire est d'ajouter le StringCollectionEditor à l'exécution, comme indiqué ci-dessous attribut de la conception.

    <Editor(GetType(StringCollectionEditor), GetType(UITypeEditor))> _

Solutions

Méthode # 1

TypeDescriptor.AddAttributes( _
    GetType(Specialized.StringCollection), _
    New EditorAttribute( _
        "System.Windows.Forms.Design.StringCollectionEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", _
         GetType(System.Drawing.Design.UITypeEditor)))

Il vous suffit d'ajouter cet attribut une fois, comme l'initialisation de l'application.

Méthode 2

Plus flexible. Voir Nicolas Cadilhac réponse ci-dessous à Ajout Editor / EditorAttribute à exécution (dynamiquement) à la propriété d'un objet. Il utilise les classes dérivées CustomTypeDescriptor et TypeDescriptionProvider. Il vous suffit d'ajouter une fois que le fournisseur, comme l'initialisation de l'application.

Était-ce utile?

La solution

Après vous avoir donné ma première réponse, je me suis rappelé une autre solution donnée par Marc Gravell que j'ai même commenté. Croyez-le ou non, il vous suffit d'appeler TypeDescriptor.AddAttributes ().

est ici: Comment puis-je injecter un UITypeEditor personnalisé pour toutes les propriétés d'un type source fermée .

Pour votre cas, il donne:

TypeDescriptor.AddAttributes(
    typeof(StringCollection),
    new EditorAttribute("System.Windows.Forms.Design.StringCollectionEditor,
        System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a",
        typeof(UITypeEditor)))

Alors peut-être que vous devez décocher ma réponse précédente et confirmer celui-ci comme la solution (bien que tout le crédit va à Marc). Mais mon précédent post vous donne encore une bonne technique quand vous avez besoin de faire des choses plus complexes avec un TypeDescriptor.

Autres conseils

Vous ne pouvez pas. Un attribut ne peut être défini au moment de la compilation (à moins que vous générer dynamiquement le type de cours)

Oui, il est possible de changer dynamiquement un TypeDescriptor afin que vous retournez le UITypeEditor que vous voulez. Ceci est expliqué dans cette . Mais notez qu'il ajoutera pour toutes les propriétés de ce type.

Je saisis le code d'ici et à peu près changé pour ce qui suit:

private class StringCollectionTypeDescriptor : CustomTypeDescriptor
{
    private Type _objectType;
    private StringCollectionTypeDescriptionProvider _provider;

    public StringCollectionTypeDescriptor(
        StringCollectionTypeDescriptionProvider provider,
        ICustomTypeDescriptor descriptor, Type objectType)
        :
        base(descriptor)
    {
        if (provider == null) throw new ArgumentNullException("provider");
        if (descriptor == null)
            throw new ArgumentNullException("descriptor");
        if (objectType == null)
            throw new ArgumentNullException("objectType");
        _objectType = objectType;
        _provider = provider;
    }

    /* Here is your customization */
    public override object GetEditor(Type editorBaseType)
    {
        return new MultilineStringEditor();
    }
}

public class StringCollectionTypeDescriptionProvider : TypeDescriptionProvider
{
    private TypeDescriptionProvider _baseProvider;

    public StringCollectionTypeDescriptionProvider(Type t)
    {
        _baseProvider = TypeDescriptor.GetProvider(t);
    }

    public override ICustomTypeDescriptor GetTypeDescriptor(Type objectType, object instance)
    {
        return new StringCollectionTypeDescriptor(this, _baseProvider.GetTypeDescriptor(objectType, instance), objectType);
    }
}

Ensuite, vous enregistrez votre fournisseur:

TypeDescriptor.AddProvider(new StringCollectionTypeDescriptionProvider
    (typeof(System.Collections.Specialized.StringCollection)),
    typeof(System.Collections.Specialized.StringCollection));

Cela fonctionne bien, sauf qu'il vous fera découvrir que vous avez une autre question: MultilineStringEditor est un éditeur qui fonctionne avec le type de chaîne, non pas avec le type StringCollection. Ce que vous avez réellement besoin est le StringCollectionEditor privé dans le cadre .Net. Alors remplaçons GetEditor par:

public override object GetEditor(Type editorBaseType)
{
    Type t = Type.GetType("System.Windows.Forms.Design.StringCollectionEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a");
    return TypeDescriptor.CreateInstance(null, t, new Type[] { typeof(Type) }, new object[] { typeof(string) });
}

J'espère que cette aide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top