Копирование вставки отключено в сетке свойств - PullRequest
2 голосов
/ 15 февраля 2010

У меня есть FileNameEditor внутри сетки свойств, в котором есть несколько записей, таких как

Основной файл: "C: \ blah1"

Sec Файл: "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);
    }
}

Спасибо

Ответы [ 2 ]

1 голос
/ 16 марта 2010

Почему вы используете пользовательский редактор? Если вы просто хотите получить строковое свойство для объекта, тогда ответ Марка Гравелла сработает.

Однако, если свойство «Файл» для объекта в сетке свойств является пользовательским классом, вам также необходимо реализовать специальный преобразователь типов.

Например:

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, поскольку это может быть весьма информативным, чтобы увидеть, как Microsoft поддерживает редактирование Color, TimeSpan, DateTime и т. Д. В сетках свойств.

Кроме того, будьте осторожны при открытии файловых диалогов. Стандартный диалог открытия файла WinForms может изменить текущий рабочий каталог вашего приложения, если вы не будете осторожны. Я не думаю, что FileNameEditor имеет эту проблему, но я проверял это только под Windows 7.

1 голос
/ 15 февраля 2010

Невозможно воспроизвести; это работает нормально - можно копировать / вставлять как в сетке, так и во всплывающем окне (есть ли у вашего свойства установщик?):

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