.Net propriété Grille. Est-il possible de laisser l'objet manipuler la grille de manière différente

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

Question

Comme je l'ai compris, la grille de la propriété est donnée un objet qui peut manipuler en extraire ses propriétés en utilisant des réflexions.

Mon problème est que j'ai un ensemble de paramètres qui est déterminée au cours de l'exécution, donc je ne peux pas composer staticly une classe avec des propriétés pour représenter cet ensemble.

J'ai deux idée à l'esprit pour résoudre ce problème, mais les deux sont complexes et consomment probablement beaucoup de temps, en fait je vais dire qu'ils ne sont pas pratiques sous mes contraintes de temps. La première consiste à utiliser la réflexion afin Emit de définir une classe dynamique et l'autre est de construire dynamiclly un fichier source C #, puis le compiler en utilisant CodeDom.

peut-il grille la propriété se comporter d'une manière différente (autre puis d'extraire les propriétés d'un objet à l'aide des réflexions) qui peut SUÍTE mon problème?

Si aucun ne vous savez tout autre contrôle qui peut faire le travail pour moi?

Je veux dire que la raison pour laquelle je suis allé à la grille de la propriété du début a été sa capacité à fournir realy belle extraction de données interface utilisateur pour la couleur de types.For commune vous autometically obtenez une palette, Pour DataTime vous avez automatiquement un beau calendrier. Je voudrais obtenir ces choses automatiquement, si possible.

Était-ce utile?

La solution

Oui, PropertyGrid peut afficher les choses autres que seulement les propriétés de compilation, en utilisant l'une des TypeConverter, ICustomTypeDescriptor ou TypeDescriptionProvider de fournir pseudo-propriétés d'exécution. Pouvez-vous donner un exemple de ce que vos paramètres ressemblent? Je devrais être en mesure de fournir un exemple ...


Voici un exemple de base (tout est string, etc.) à partir d'une réponse précédente (liés mais différents):

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
                }}
            });
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top