Frage

Wie füge ich den EditorAttribute (Editor) zur Laufzeit eines Objekts zur Eigenschaft eines Objekts hinzu?

Ich habe My.Settings.ExcludeFiles, das vom Einstellungsdesigner als erstellt wird Public Property ExcludedFiles() As Global.System.Collections.Specialized.StringCollection. Beim Bearbeiten ExcludedFiles Über ein Eigenschaftsraster generiert der "String Collection-Editor" einen "Konstruktor auf dem Typ" System "String 'nicht gefunden".

Ich kann die Attribute der Attribute nicht ändern ExcludeFiles Eigentum, weil sie beim nächsten Mal überschrieben werden, wenn Änderungen vorgenommen werden. Daher muss ich die Editor/EditorAttribute zur Laufzeit anhängen/hinzufügen.

Was ich tun möchte, ist das hinzuzufügen StringCollectionEditor Zur Laufzeit, unten als Design-Time-Attribut gezeigt.

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

Lösungen

Methode 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)))

Sie müssen dieses Attribut nur einmal hinzufügen, z. B. die Anwendungsinitialisierung.

Methode Nr. 2

Flexibler. Siehe Nicolas Cadilhac Antwort unten bei Hinzufügen von Editor / EditorAttribute zur Laufzeit (dynamisch) in die Eigenschaft eines Objekts. Es verwendet abgeleitete CustomTyPedescriptor- und TypedescriptionProvider -Klassen. Sie müssen den Anbieter nur einmal hinzufügen, z. B. die Anwendungsinitialisierung.

War es hilfreich?

Lösung

Nachdem ich Ihnen meine erste Antwort gegeben hatte, erinnerte ich mich an eine andere Lösung von Marc Gravell, die ich sogar kommentierte. Ob Sie es glauben oder nicht, Sie müssen nur typeDescriptor.addattributes () aufrufen.

Das ist hier: Wie injiziere ich einen benutzerdefinierten UityPeeditor für alle Eigenschaften eines Typs geschlossene Quelle?.

Für Ihren Fall gibt es:

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

Vielleicht sollten Sie meine vorherige Antwort deaktivieren und diese als Lösung bestätigen (obwohl der gesamte Kredit an Marc geht). Aber mein vorheriger Beitrag gibt Ihnen immer noch eine gute Technik, wenn Sie komplexere Dinge mit einem Typedeskriptor machen müssen.

Andere Tipps

Du kannst nicht. Ein Attribut kann nur zur Kompilierungszeit definiert werden (es sei denn, Sie generieren natürlich dynamisch dynamisch)

Ja, es ist möglich, einen typedescriptor dynamisch zu ändern, damit Sie den gewünschten UityPeeditor zurückgeben. Dies wird darin erklärt Artikel. Beachten Sie jedoch, dass es für alle Eigenschaften dieses Typs hinzugefügt wird.

Ich habe den Code von hier aus gepackt und ihn für Folgendes grob geändert:

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);
    }
}

Dann registrieren Sie Ihren Anbieter:

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

Dies funktioniert gut, außer dass Sie feststellen, dass Sie ein weiteres Problem haben: Multilinestringeditor ist ein Editor, der mit dem String -Typ und nicht mit dem StringCollection -Typ funktioniert. Was Sie tatsächlich brauchen, ist der private StringCollectioneditor im .NET -Framework. Ersetzen wir also den Geteditor durch:

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) });
}

Ich hoffe das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top