Frage

Ich habe eine FileNameEditor in einem Eigenschaftenraster, die einige Einträge wie

hat

Haupt Datei: "C: \ blah1"

Sec Datei: "C: \ blah2"

und so weiter.

Mein Problem ist, dass ich nicht von einer Eigenschaft Eintrag in einer anderen kopieren und einfügen kann, und ich kann in den Bereichen sowohl manuell als auch nicht geben. Gibt es eine bestimmte Eigenschaft, die innerhalb des FileNameEditor ermöglicht die Bearbeitung. Beispiel

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

Danke

War es hilfreich?

Lösung

Warum verwenden Sie einen benutzerdefinierten Editor? Wenn Sie nur einen String-Eigenschaft auf ein Objekt wollen, dann Marc GRA Antwort funktioniert.

Wenn jedoch die „Datei“ Eigenschaft auf dem Objekt im Eigenschaftenraster ist eine benutzerdefinierte Klasse, die Sie auch einen benutzerdefinierten Typ-Wandler implementieren müssen.

Beispiel:

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

Um die Bearbeitung der Dateinamen anstelle zu unterstützen und auch Ausschneiden und Einfügen der Property muss wissen, wie aus einer Zeichenfolge zu Ihrem „Datei“ Typ konvertieren und wieder zurück. Wenn Sie nicht über die Bekehrter zur String-Methoden in der Typeconverter implementieren wird die Eigenschaft des Ergebnis des ToString () des Objekts angezeigt werden.

Ich schlage vor, zücken Reflector.Net und Lesen der Quelle einiger der UITypeEditor und Typeconverter in der BCL, da es recht informativ sein kann, um zu sehen, wie Microsoft unterstützt die Bearbeitung Farbe, Timespan, Datetime etc in Immobilien Grids.

Seien Sie auch vorsichtig Öffnen der Datei Dialoge. Der Standard-WinForms Datei-Dialog können Sie Ihre Anwendungen aktuelles Arbeitsverzeichnis ändern, wenn Sie nicht vorsichtig sind. Ich glaube nicht, FileNameEditor dieses Problem hat, aber ich habe nur diese unter Windows 7 getestet.

Andere Tipps

Kann nicht reproduzieren; Dies funktioniert gut - sowohl im Netz und im Popup-copy / paste (? tut Ihr Eigentum eine Setter hat):

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);
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top