Comment modifier PropertyGrid à l’exécution (ajout / suppression de propriétés et de types / enums dynamics)

Comment modifier un propertygrid à l’exécution de toutes les manières? Je veux pouvoir append et supprimer des propriétés et append des “types dynamics”. Ce que je veux dire par là est un type qui résulte en un menu déroulant généré par le moteur d’exécution dans le propertygrid à l’aide d’un TypeConverter.

En fait, j’ai pu faire ces deux choses (append / supprimer des propriétés et append du type dynamic), mais pas séparément en même temps.

Pour implémenter la prise en charge de l’ajout et de la suppression de propriétés à l’exécution, j’ai utilisé cet article codeproject et modifié un peu le code pour prendre en charge différents types (pas seulement des chaînes).

private System.Windows.Forms.PropertyGrid propertyGrid1; private CustomClass myProperties = new CustomClass(); public Form1() { InitializeComponent(); myProperties.Add(new CustomProperty("Name", "Sven", typeof(ssortingng), false, true)); myProperties.Add(new CustomProperty("MyBool", "True", typeof(bool), false, true)); myProperties.Add(new CustomProperty("CaptionPosition", "Top", typeof(CaptionPosition), false, true)); myProperties.Add(new CustomProperty("Custom", "", typeof(StatesList), false, true)); //<-- doesn't work } ///  /// CustomClass (Which is binding to property grid) ///  public class CustomClass: CollectionBase,ICustomTypeDescriptor { ///  /// Add CustomProperty to Collectionbase List ///  ///  public void Add(CustomProperty Value) { base.List.Add(Value); } ///  /// Remove item from List ///  ///  public void Remove(ssortingng Name) { foreach(CustomProperty prop in base.List) { if(prop.Name == Name) { base.List.Remove(prop); return; } } } 

etc…

 public enum CaptionPosition { Top, Left } 

Ma solution complète peut être téléchargée ici .

Cela fonctionne bien lorsque j’ajoute des chaînes, des bools ou des énumérations, mais lorsque j’essaie d’append un “type dynamic” comme StatesList, cela ne fonctionne pas. Est-ce que quelqu’un sait pourquoi et peut m’aider à le résoudre?

 public class StatesList : System.ComponentModel.SsortingngConverter { private ssortingng[] _States = { "Alabama", "Alaska", "Arizona", "Arkansas" }; public override System.ComponentModel.TypeConverter.StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) { return new StandardValuesCollection(_States); } public override bool GetStandardValuesSupported(ITypeDescriptorContext context) { return true; } public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) { return true; } } 

La méthode d’utilisation d’un TypeConverter fonctionne correctement lorsque vous n’essayez pas d’append la propriété au moment de l’exécution. Par exemple, ce code fonctionne sans problème, mais je veux pouvoir faire les deux.

S’il vous plaît jeter un oeil à mon projet . Merci!

Ce que vous faites est d’append StatesList (un TypeConverter) en tant que propriété.
Ce que vous devez faire, c’est append une propriété avec StatesList en tant que TypeConverter.

Ah bien sur!

 myProperties.Add(new CustomProperty("Custom", "", typeof(States), false, true)); [TypeConverter(typeof(StatesList))] public class States { } 

Fonctionne comme un charme, merci!

J’ai mis à jour mon projet, j’espère qu’il pourra être utile à d’autres, vous pouvez le trouver ici .

Cette question et cette réponse m’ont été d’une grande utilité. Cependant, j’avais besoin d’aller un peu plus loin en autorisant les valeurs des listes déroulantes générées au moment de l’exécution. Je pensais publier un exemple de code indiquant ce dont il avait besoin, au cas où quelqu’un le trouverait utile.

Tout d’abord, j’ai ajouté un paramètre d’options au constructeur CustomProperty, puis une propriété Options:

  private List lOptions; public CustomProperty(ssortingng sName, object value, Type tType, bool bReadOnly, bool bVisible, List lOptions) { this.lOptions = lOptions; } public List Options { get { return lOptions; } } 

Deuxièmement, j’ai ajouté une propriété Options à la classe CustomPropertyDescriptor:

  public List Options { get { return m_Property.Options; } } 

Troisièmement, je devais modifier la méthode GetStandardValues ​​dans ma classe de type dynamic (c.-à-d. StatesList) pour utiliser la nouvelle propriété Options de l’object CustomPropertyDescriptor:

  public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) { CustomPropertyDescriptor descriptor = (CustomPropertyDescriptor)context.PropertyDescriptor; return new StandardValuesCollection(descriptor.Options); } 

Enfin, je devais transmettre ma liste d’options lors de la création d’un nouvel object CustomProperty:

  List optionsList = new List(new ssortingng[] { "test1", "test2", "test3" }); CustomProperty myProperty = new CustomProperty(attr.Name, attr.Value, valueType, false, true, optionsList); 

Au lieu de la liste statique que j’ai transmise pour cet exemple, vous pouvez générer la liste d’options de votre liste déroulante de la manière qui vous convient, vous donnant ainsi un contrôle total sur les options disponibles.

dans mon cas, TypeConverter ne s’appliquait pas à la classe States

 [TypeConverter(typeof(StatesList))] // not work public class States { } 

donc j’ai ajouté le remplacement dans CustomPropertyDescriptor

 public override TypeConverter Converter { get { if (this.PropertyType.Equals(typeof(States)) ) { return new StatesList(); ; } return base.Converter; } }