سؤال

ولدي FileNameEditor داخل شبكة الملكية، التي لديها عدد قليل من القيود مثل

والملف الرئيسي: "C: \ blah1"

وثانية الملف: "C: \ blah2"

ووهلم جرا.

ومشكلتي هي أنني لا يمكن نسخ ولصق من دخول خاصية واحدة إلى أخرى، وأنا لا يمكن أن اكتب في الحقول يدويا كذلك. هناك خاصية معينة من شأنها أن تمكن تحرير داخل FileNameEditor. مثال

public class MyEditor : FileNameEditor
{
    public override bool GetPaintValueSupported(ITypeDescriptorContext context)
    {
        return false;
    }

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)

    {

        object e = base.EditValue(context, provider, value);

        if ((value as MyFileS) != null)
        {
            (value as MyFilesS).FileName = (String) e;
        }

        return e;
    }

    protected override void InitializeDialog(OpenFileDialog openFileDialog)
    {
        base.InitializeDialog(openFileDialog);
    }
}

والشكر

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

المحلول

لماذا أنت باستخدام محرر مخصص؟ إذا كنت ترغب فقط في خاصية سلسلة على كائن ثم الجواب مارك Gravell لتعمل.

ولكن إذا كانت الممتلكات "ملف" على الكائن ضمن شبكة الملكية هي فئة مخصصة تحتاج أيضا إلى تنفيذ تحويل نوع مخصص.

وعلى سبيل المثال:

namespace WindowsFormsApplication
{
    using System;
    using System.ComponentModel;
    using System.Drawing.Design;
    using System.Globalization;
    using System.Windows.Forms;
    using System.Windows.Forms.Design;

    class MyEditor : FileNameEditor
    {
        public override bool GetPaintValueSupported(ITypeDescriptorContext context)
        {
            return false;
        }

        public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
        {
            string s = Environment.CurrentDirectory;
            object e = base.EditValue(context, provider, value);
            Environment.CurrentDirectory = s;

            var myFile = value as MyFile;
            if (myFile != null && e is string)
            {
                myFile.FileName = (string)e;
                return myFile;
            }

            return e;
        }
    }

    class MyFileTypeConverter : TypeConverter
    {
        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
        {
            if (sourceType == typeof(string))
                return true;

            return base.CanConvertFrom(context, sourceType);
        }

        public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
        {
            if (destinationType == typeof(string))
                return true;

            return base.CanConvertTo(context, destinationType);
        }

        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
        {
            if (value is string)
                return new MyFile { FileName = (string)value };

            return base.ConvertFrom(context, culture, value);
        }

        public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
        {
            var myFile = value as MyFile;
            if (myFile != null && destinationType == typeof(string))
                return myFile.FileName;

            return base.ConvertTo(context, culture, value, destinationType);
        }
    }

    [TypeConverter(typeof(MyFileTypeConverter))]
    [Editor(typeof(MyEditor), typeof(UITypeEditor))]
    class MyFile
    {
        public string FileName { get; set; }
    }

    class MyFileContainer
    {
        public MyFileContainer()
        {
            File1 = new MyFile { FileName = "myFile1.txt" };
            File2 = new MyFile { FileName = "myFile2.txt" };
        }

        public MyFile File1 { get; set; }
        public MyFile File2 { get; set; }
    }

    static public class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            using (var f = new Form())
            using (var pg = new PropertyGrid())
            {
                pg.Dock = DockStyle.Fill;
                pg.SelectedObject = new MyFileContainer();
                f.Controls.Add(pg);
                Application.Run(f);
            }
        }
    }
}

لدعم تحرير اسم الملف في مكان، وكذلك قص ولصق PropertyGrid يحتاج إلى معرفة كيفية تحويل من سلسلة لديك نوع "ملف" والعودة مرة أخرى. إذا لم يكن لتنفيذ تحويل إلى أساليب السلسلة في TypeConverter الممتلكات سيتم عرض نتيجة ToString الكائن ().

وأقترح الجلد من Reflector.Net وقراءة بعض المصادر الى من UITypeEditors وTypeConverters في BCL لأنها يمكن أن تكون مفيدة جدا لنرى كيف تدعم مايكروسوفت تحرير اللون، زمنية، التاريخ والوقت وغيرها في شبكات الممتلكات.

وبالإضافة إلى ذلك، نكون حذرين الحوارات فتح الملف. الحوار WinForms عناصر القياسية ملف مفتوح يمكن تغيير التطبيقات الخاصة بك دليل العمل الحالي إذا كنت غير دقيق. لا أعتقد FileNameEditor ديه هذه المشكلة، ولكن لقد اختبرت هذا فقط تحت ويندوز 7.

نصائح أخرى

لا يمكن استنساخها. هذا يعمل بشكل جيد - يمكن نسخ / لصق على حد سواء في الشبكة والمنبثقة (؟ هل الممتلكات الخاصة بك لديها اضع):

using System;
using System.ComponentModel;
using System.Drawing.Design;
using System.Windows.Forms;
using System.Windows.Forms.Design;
class Foo
{
    [Editor(typeof(FileNameEditor), typeof(UITypeEditor))]
    public string Name { get; set; }

    [STAThread]
    static void Main()
    {
        using (Form form = new Form())
        using (PropertyGrid grid = new PropertyGrid())
        {
            grid.Dock = DockStyle.Fill;
            form.Controls.Add(grid);
            grid.SelectedObject = new Foo();
            Application.Run(form);
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top