2009-05-31 11 views
1

Comme je l'ai compris, la grille de propriétés reçoit un objet qu'elle peut manipuler en extrayant 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é pendant l'exécution, donc je ne peux pas composer de manière statique une classe avec des propriétés pour représenter cet ensemble. J'ai deux idées en tête pour résoudre ce problème, mais les deux sont complexes et vont probablement consommer beaucoup de temps, en fait, je dirai qu'ils ne sont pas pratiques dans mes contraintes de temps. L'une consiste à utiliser Reflection Emit afin de définir dynamiquement une classe et l'autre à générer dynamiquement un fichier source C#, puis à le compiler à l'aide de CodeDom.Grille de propriété .Net. Existe-t-il un moyen de laisser la grille manipuler l'objet de manière différente?

La grille Property peut-elle se comporter d'une manière différente (autre que l'extraction des propriétés d'un objet en utilisant des réflexions) qui peut résoudre mon problème?

Si non connaissez-vous un 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é était sa capacité à fournir une interface utilisateur de récupération de données vraiment sympa pour les types courants.Pour la couleur vous obtenez automatiquement une palette, Pour dataTime vous avez automatiquement un bon calendrier . Je voudrais obtenir ces choses automatiquement, si possible.

Répondre

5

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 à quoi ressemblent vos paramètres? Je devrais être en mesure de fournir un exemple ...


est ici un exemple de base (tout est string, etc.) à partir d'une earlier reply (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 
       }} 
      }); 
    } 
} 
+0

laisse supposer que j'ai dictionnaire de qui se remplit dynamiquement lorsque l'application démarre – user88637

+0

Merci beaucoup (limite de 15 chiffres :)) – user88637