2009-08-10 9 views
1

Je voudrais pouvoir définir la visibilité d'une propriété sur ma grille de propriétés en utilisant App.config. J'ai essayé:Grille de propriétés .NET - setting Browsable (booléen) utilisant App.config

[Browsable(bool.Parse(Sytem.Configuration.ConfigurationSettings.AppSettings["testBool"]))]

Cependant Visual Studio 2008 me donnerait une erreur "Un argument d'attribut doit être une expression constante, expression typeof ou un tableau d'expression création d'un type de paramètre d'attribut". Y at-il un moyen de définir ce bool sur App.config?

+0

(noter que je mis à jour ma réponse avec un exemple qui pourrait faire le plus de ce que vous voulez) –

+0

voir aussi: http://stackoverflow.com/questions/1093466/c-dynamic-attribute-arguments –

Répondre

2

vous ne pouvez pas faire plus haut dans le fichier app.config. Ceci est basé sur le temps de conception et votre app.config est lu et utilisé lors de l'exécution.

1

La grille de propriétés utilise la réflexion pour déterminer quelles propriétés afficher et comment les afficher. Vous ne pouvez pas définir ceci dans n'importe quel type de fichier de configuration. Vous devez appliquer cet attribut à la propriété de la classe elle-même.

2

Vous ne pouvez pas le faire via la configuration; mais vous pouvez contrôler les attributs en écrivant une implémentation de modèle de composant personnalisée; c'est-à-dire en écrivant votre propre PropertyDescriptor, et en utilisant ICustomTypeDescriptor ou TypeDescriptionProvider pour l'associer. Beaucoup de travail.


Mise à jour

Je pensais que d'une façon sournoise de le faire; voir ci-dessous, où nous le filtrons à 2 des propriétés en utilisant une chaîne à l'exécution. Si vous ne possédez pas le type (pour régler la [TypeConverter]), vous pouvez utiliser:

TypeDescriptor.AddAttributes(typeof(Test), 
    new TypeConverterAttribute(typeof(TestConverter))); 

d'associer le convertisseur à l'exécution.

using System.Windows.Forms; 
using System.ComponentModel; 
using System.Collections.Generic; 
using System; 
class TestConverter : ExpandableObjectConverter 
{ 
    public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, System.Attribute[] attributes) 
    { 
     PropertyDescriptorCollection orig = base.GetProperties(context, value, attributes); 
     List<PropertyDescriptor> list = new List<PropertyDescriptor>(orig.Count); 
     string propsToInclude = "Foo|Blop"; // from config 
     foreach (string propName in propsToInclude.Split('|')) 
     { 
      PropertyDescriptor prop = orig.Find(propName, true); 
      if (prop != null) list.Add(prop); 
     } 
     return new PropertyDescriptorCollection(list.ToArray()); 
    } 
} 
[TypeConverter(typeof(TestConverter))] 
class Test 
{ 
    public string Foo { get; set; } 
    public string Bar { get; set; } 
    public string Blop { get; set; } 

    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Test test = new Test { Foo = "foo", Bar = "bar", Blop = "blop"}; 
     using (Form form = new Form()) 
     using (PropertyGrid grid = new PropertyGrid()) 
     { 
      grid.Dock = DockStyle.Fill; 
      form.Controls.Add(grid); 
      grid.SelectedObject = test; 
      Application.Run(form); 
     } 
    } 
} 
+0

C'est une réponse très instruite sur le sujet. En utilisant ICustomTypeDescriptor ou les autres types associés (vérifiez MSDN pour voir ce qui fonctionne le mieux pour votre conception) vous pouvez initialiser vos descripteurs avec des valeurs de configuration, mais vous devrez faire le travail manuellement (comme la configuration, voir System.Configuration.ConfigurationSection et similaire pour cela) comme les descripteurs de type par défaut utilisent des attributs appliqués aux informations de type d'assembly à la compilation. – TheXenocide

Questions connexes