Comment modifier une grille de propriétés à l'exécution de toutes les manières possibles? Je veux pouvoir ajouter et supprimer des propriétés et ajouter des "types dynamiques", ce que je veux dire par là est un type qui résulte en une liste déroulante générée à l'exécution dans la grille de propriétés en utilisant un TypeConverter.Comment modifier PropertyGrid au moment de l'exécution (ajouter/supprimer des propriétés et des types dynamiques/enums)
J'ai effectivement été capable de faire ces deux choses (ajouter/supprimer des propriétés et ajouter un type dynamique) mais seulement séparément, pas en même temps.
Pour implémenter le support pour ajouter et supprimer des propriétés à l'exécution j'ai utilisé this codeproject article et modifié le code un peu pour supporter 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(string), 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
}
/// <summary>
/// CustomClass (Which is binding to property grid)
/// </summary>
public class CustomClass: CollectionBase,ICustomTypeDescriptor
{
/// <summary>
/// Add CustomProperty to Collectionbase List
/// </summary>
/// <param name="Value"></param>
public void Add(CustomProperty Value)
{
base.List.Add(Value);
}
/// <summary>
/// Remove item from List
/// </summary>
/// <param name="Name"></param>
public void Remove(string 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 here.
Cela fonctionne très bien quand j'ajoute des chaînes, des booléens ou des énumérations, mais quand j'essaye d'ajouter un "type dynamique" 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.StringConverter
{
private string[] _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 très bien lorsque vous ne cherchez pas à ajouter la propriété lors de l'exécution, par exemple this code fonctionne sans aucun problème, mais je veux être en mesure de faire les deux.
Veuillez jeter un coup d'œil à my project. Merci!
Vous êtes bienvenus :) –
Je sais que le poste est très vieux, mais je J'ai une petite question. J'utilise exactement votre code dans mon application, mais la liste déroulante personnalisée ne fonctionne pas. Le nom de la propriété est grisé et aucune option n'est disponible. Une idée, ce que je peux faire pour résoudre ce problème? Merci à l'avance, Martin – user653427
@ user653427, il pourrait également être utile pour poster une nouvelle question et lien Comme il est une vieille question de retour à cette page. Vous serez en mesure de donner plus de détails et d'atteindre plus de gens de cette façon. –