.Net cuadrícula de propiedades. ¿Hay una manera de dejar la rejilla manipular objetos en forma diferente

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

Pregunta

Como comprenderá, la rejilla de propiedades se da un objeto que se puede manipular mediante la extracción de sus propiedades utilizando reflexiones.

Mi problema es que tengo un conjunto de parámetros que se determina durante el tiempo de ejecución, por lo tanto no puedo componer staticly una clase con propiedades para representar este conjunto.

Tengo dos idea en mente para resolver este problema, pero ambos son complejos y probablemente consumir mucho tiempo, de hecho voy a decir que no son prácticos bajo mis limitaciones de tiempo. Uno es utilizar Reflection Emit con el fin de definir una clase dinámica y el otro es para construir dynamiclly un archivo fuente C # y luego compilarlo usando CodeDom.

Puede cuadrícula de propiedades se comportan de manera diferente (que no sea la extracción de las propiedades de un objeto usando reflexiones) que puede suite de mi problema?

Si no sabes cualquier otro control que puede hacer el trabajo para mí?

quiero decir que la razón por la que fui a la cuadrícula de propiedades desde el principio fue su capacidad para proporcionar realmente agradable recuperación de datos de la interfaz de usuario para el color types.For común que autometically obtener una gama de colores, para DataTime automáticamente tiene un buen calendario. Me gustaría conseguir esas cosas de forma automática, si es posible.

¿Fue útil?

Solución

Sí, PropertyGrid puede mostrar cosas otros que sólo las propiedades de tiempo de compilación, mediante el uso de cualquiera de TypeConverter, ICustomTypeDescriptor o TypeDescriptionProvider para proporcionar en tiempo de ejecución pseudo-propiedades. ¿Puede dar un ejemplo de lo que sus parámetros se parecen? Debería ser capaz de proporcionar un ejemplo ...


Aquí hay un ejemplo básico (todo es string, etc.) en base a una anterior respuesta (relacionado pero diferente):

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
                }}
            });
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top