Net Property Grid. Gibt es eine Möglichkeit das Gitter manipuliert Objekt auf unterschiedliche Weise zu lassen

StackOverflow https://stackoverflow.com/questions/931644

Frage

Wie ich verstanden, das Eigenschaftenraster ist ein Objekt gegeben, die sie durch das Extrahieren seiner Eigenschaften mit Reflexionen manipulieren kann.

Mein Problem ist, dass ich einen Satz von Parametern, die während der Laufzeit bestimmt wird, so kann ich nicht staticly eine Klasse mit Eigenschaften zusammensetzt diesen Satz darzustellen.

Ich habe zwei Idee im Kopf, dieses Problem zu lösen, aber beide sind komplex und werden wahrscheinlich viel Zeit verbrauchen, infact ich werde sagen, dass sie unter meinen Zeitbeschränkungen nicht praktisch sind. Eine davon ist die Reflektionsausgabe zu verwenden, um eine Klasse dynamisch zu definieren, und der andere ist auf dynamiclly eine Datei C # Quelle zu bauen und dann kompiliert CodeDom verwenden.

Kann Property Grid in einer anderen Art und Weise verhalten (andere dann die Eigenschaften eines Objekts zu extrahieren mit Reflexionen), die mein Problem Suite kann?

Wenn kein wissen Sie, andere Steuerung, die den Job für mich tun?

Ich möchte sagen, dass der Grund, warum ich von Anfang an das Eigenschaftenraster ging, war seine Fähigkeit, wirklich schön Data Retrieval UI für gemeinsame types.For Farbe zu liefern autometically Sie eine Palette gehen, dass Datatime Sie automatisch einen schönen Kalender haben. Ich mag diese Dinge automatisch erhalten, wenn möglich.

War es hilfreich?

Lösung

Ja, PropertyGrid kann Dinge zeigen andere als nur die Kompilierung-Eigenschaften, die von einem der TypeConverter, ICustomTypeDescriptor oder TypeDescriptionProvider mit Laufzeit pseudo-Eigenschaften bereitzustellen. Können Sie ein Beispiel geben, was wie Ihre Parameter aussehen? Ich soll ein Beispiel liefern kann ...


Hier ist ein einfaches Beispiel (alles ist string, etc), basierend auf einem früher antworten (bezogen aber verschieden):

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;
class PropertyBagPropertyDescriptor : PropertyDescriptor {
    public PropertyBagPropertyDescriptor(string name) : base(name, null) { }
    public override object GetValue(object component) {
        return ((PropertyBag)component)[Name];
    }
    public override void SetValue(object component, object value) {
        ((PropertyBag)component)[Name] = (string)value;
    }
    public override void ResetValue(object component) {
        ((PropertyBag)component)[Name] = null;
    }
    public override bool CanResetValue(object component) {
        return true;
    }
    public override bool ShouldSerializeValue(object component)
    { // *** this controls whether it appears bold or not; you could compare
      // *** to a default value, or the last saved value...
        return ((PropertyBag)component)[Name] != null;
    }
    public override Type PropertyType {
        get { return typeof(string); }
    }
    public override bool IsReadOnly {
        get { return false; }
    }
    public override Type ComponentType {
        get { return typeof(PropertyBag); }
    }
}
[TypeConverter(typeof(PropertyBagConverter))]
class PropertyBag {
    public string[] GetKeys() {
        string[] keys = new string[values.Keys.Count];
        values.Keys.CopyTo(keys, 0);
        Array.Sort(keys);
        return keys;
    }
    private readonly Dictionary<string, string> values
        = new Dictionary<string, string>();
    public string this[string key] {
        get {
            string value;
            values.TryGetValue(key, out value);
            return value;
        }
        set {
            if (value == null) values.Remove(key);
            else values[key] = value;
        }
    }
}
// has the job of (among other things) providing properties to the PropertyGrid
class PropertyBagConverter : TypeConverter {
    public override bool GetPropertiesSupported(ITypeDescriptorContext context) {
        return true; // are we providing custom properties from here?
    }
    public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, System.Attribute[] attributes) {
        // get the pseudo-properties
        PropertyBag bag = (PropertyBag)value;
        string[] keys = bag.GetKeys();
        PropertyDescriptor[] props = Array.ConvertAll(
            keys, key => new PropertyBagPropertyDescriptor(key));
        return new PropertyDescriptorCollection(props, true);
    }
}

static class Program {
    [STAThread]
    static void Main() { // demo form app
        PropertyBag bag = new PropertyBag();
        bag["abc"] = "def";
        bag["ghi"] = "jkl";
        bag["mno"] = "pqr";
        Application.EnableVisualStyles();
        Application.Run(
            new Form {
                Controls = { new PropertyGrid {
                    Dock = DockStyle.Fill,
                    SelectedObject = bag
                }}
            });
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top