Domanda

Ho un FileNameEditor all'interno di una griglia di proprietà, che ha un paio di voci come

File principale: "C: \ blah1"

File Sec: "C: \ blah2"

e così via.

Il mio problema è che non riesco a copiare e incollare da una voce di proprietà ad un altro, e non posso digitare nei campi manualmente. C'è una proprietà specifica che consentirà la modifica all'interno del FileNameEditor. Esempio

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

Grazie

È stato utile?

Soluzione

Perché stai usando un editor personalizzato? Se si desidera solo una proprietà stringa su un oggetto, allora la risposta di Marc Gravell funziona.

Tuttavia, se il "file" di proprietà sull'oggetto all'interno della griglia proprietà è una classe personalizzata è inoltre necessario implementare un convertitore di tipo personalizzato.

Esempio:

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

Per sostenere la modifica del nome del file al suo posto e anche tagliare e incollare il PropertyGrid ha bisogno di sapere come convertire da una stringa al vostro tipo di "File" e viceversa. Se non implementare il convertito ai metodi di stringa nel TypeConverter proprietà visualizzerà il risultato del ToString dell'oggetto ().

Suggerisco frustare fuori Reflector.Net e leggendo la fonte di alcune delle UITypeEditors e TypeConverters nel BCL come può essere abbastanza informativo per vedere come Microsoft supporta l'editing a colori, TimeSpan, DateTime ecc in griglie di proprietà.

Inoltre, fare attenzione a finestre di dialogo file di apertura. La finestra di dialogo WinForms standard di file aperto può cambiare le applicazioni directory di lavoro corrente, se non stai attento. Non credo FileNameEditor ha questo problema, ma ho testato solo questo sotto Windows 7.

Altri suggerimenti

Non è possibile riprodurre; questo funziona bene - è possibile copiare / incollare sia nella griglia e il popup (? fa la vostra proprietà ha un setter):

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);
        }
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top