Question

J'ai FileNameEditor l'intérieur d'une grille de propriété, qui a quelques entrées comme

Fichier principal: "C: \ blah1"

Sec fichier: "C: \ blah2"

et ainsi de suite.

Mon problème est que je ne peux pas copier et coller à partir d'une entrée de la propriété à l'autre, et je ne peux pas taper dans les champs manuellement. Y at-il une propriété spécifique qui permettra à l'intérieur du montage FileNameEditor. Exemple

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

Merci

Était-ce utile?

La solution

Pourquoi utilisez-vous un éditeur personnalisé? Si vous voulez juste une propriété de chaîne sur un objet, puis la réponse de Marc Gravell fonctionne.

Toutefois, si la propriété « Fichier » sur l'objet dans la grille de la propriété est une classe personnalisée, vous devez également mettre en œuvre un convertisseur de type personnalisé.

Par exemple:

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

Pour soutenir la modification du nom de fichier en place et aussi couper et coller le PropertyGrid a besoin de savoir comment convertir une chaîne à votre type « Fichier » et inversement. Si vous ne mettez pas en œuvre la convertir aux méthodes de la chaîne dans la propriété TypeConverter affichera le résultat de ToString de l'objet ().

Je suggère fouettant Reflector.Net et la lecture de la source à certains des UITypeEditors et TypeConverters dans la BCL comme il peut être très instructif de voir comment Microsoft prend en charge l'édition couleur, TimeSpan, DateTime etc dans les réseaux de propriété.

En outre, prenez garde des boîtes de dialogue d'ouverture du fichier. La boîte de dialogue standard de fichier ouvert WinForms peut modifier vos applications répertoire de travail si vous ne faites pas attention. Je ne pense pas FileNameEditor a ce problème, mais je ne l'ai testé sous Windows 7.

Autres conseils

Impossible de reproduire; cela fonctionne très bien - peut copier / coller aussi bien dans la grille et la fenêtre contextuelle (? t votre propriété ont 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);
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top