إضافة محرر / Editorattribute في وقت التشغيل (ديناميكيا) إلى خاصية كائن

StackOverflow https://stackoverflow.com/questions/2043579

سؤال

كيفية إضافة Editorattribute (محرر) إلى خاصية كائن في وقت التشغيل؟

أملك My.Settings.ExcludeFiles, ، والتي يتم إنشاؤها بواسطة مصمم الإعدادات كما Public Property ExcludedFiles() As Global.System.Collections.Specialized.StringCollection. وبعد عند التحرير ExcludedFiles عبر شبكة الممتلكات، يولد "محرر مجموعة السلسلة" نظام "منشئ على نوع". استثناء وقت التشغيل "لم يتم العثور عليه".

لا أستطيع تغيير سمات ExcludeFiles خاصية لأنها سيتم الكتابة فوقها في المرة التالية التي يتم بها إجراء أي تغييرات إعداد. لذلك، يجب علي إرفاق / إضافة المحرر / Editorattribute في وقت التشغيل.

ما أريد القيام به هو إضافة StringCollectionEditor في وقت التشغيل، المعروضة أدناه كاسمامة وقت التصميم.

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

حلول

طريقة 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)))

يجب عليك فقط إضافة هذه السمة مرة واحدة، مثل تهيئة التطبيق.

الطريقة رقم 2

أكثر مرونة. انظر nicolas cadilhac الإجابة أدناه في إضافة محرر / Editorattribute في وقت التشغيل (ديناميكيا) إلى خاصية كائن. وبعد يستخدم فئات Customypedescriptor المشتقة و TypedescriptionProvider. يجب عليك فقط إضافة المزود مرة واحدة، مثل تهيئة الطلب.

هل كانت مفيدة؟

المحلول

بعد إعطائك إجابتي الأولى، تذكرت حلا آخر قدمه مارك جرافيل الذي علقته حتى. صدق ذلك أم لا، تحتاج فقط إلى استدعاء typedescriptor.addattributes ().

هذا هنا: كيف حقق uitypeeditor مخصص لجميع خصائص نوع مصدر مغلق؟.

لحالتك تعطي:

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

لذلك ربما يجب عليك إلغاء تحديد إجابتي السابقة وتأكيد هذا واحد كحل (على الرغم من أن كل الائتمان يذهب إلى مارك). لكن مشاركتي السابقة لا تزال تعطيك تقنية جيدة عندما تحتاج إلى القيام بأشياء أكثر تعقيدا مع مطبوع.

نصائح أخرى

لا يمكنك. يمكن تعريف السمة فقط عند تجميع الوقت (إلا إذا قمت بإنشاء النوع ديناميكيا بالطبع)

نعم، من الممكن تغيير نموذج مطبوع ديناميكيا بحيث تقوم بإرجاع UityPeDitor الذي تريده. هذا موضح في هذا مقالة - سلعة. وبعد ولكن لاحظ أنه سيضيفه لجميع خصائص هذا النوع.

أمسكت برمز من هنا وتغييرها تقريبا لما يلي:

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

ثم قمت بتسجيل مزودك:

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

يعمل هذا بشكل جيد، باستثناء أنه سيجعلك تكتشف أن لديك مشكلة أخرى: MultiLItReStristitor هو محرر يعمل مع نوع السلسلة، وليس باستخدام نوع StringCollection. ما تحتاجه فعلا هو STRSCollectionEditor الخاص في .NET Framework. لذلك دعونا استبدال geteeditor بواسطة:

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

آمل أن يساعد هذا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top