¿Cómo se modifica una propiedad cuadrícula en tiempo de ejecución en todos los sentidos? Quiero poder agregar y eliminar propiedades y agregar "tipos dinámicos", lo que quiero decir con que es un tipo que da como resultado un menú desplegable generado en tiempo de ejecución en la propiedad grid usando un TypeConverter.Cómo modificar PropertyGrid en tiempo de ejecución (agregar/eliminar propiedades y tipos dinámicos/enumeraciones)
En realidad, he podido hacer ambas cosas (agregar/eliminar propiedades y agregar tipo dinámico) pero solo por separado, no al mismo tiempo.
Para implementar el soporte para agregar y eliminar propiedades en tiempo de ejecución usé this codeproject article y modifiqué un poco el código para admitir diferentes tipos (no solo cadenas).
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
}
Mi solución completa se puede descargar here.
Funciona bien cuando agrego cadenas, bools o enums, pero cuando intento agregar un "tipo dinámico" como StatesList, no funciona. ¿Alguien sabe por qué y puede ayudarme a resolverlo?
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;
}
}
El método de uso de un TypeConverter funciona bien cuando no se intenta añadir la propiedad en tiempo de ejecución, por ejemplo this code funciona sin ningún problema, pero yo quiero ser capaz de hacer ambas cosas.
Por favor, eche un vistazo a my project. Gracias!
que estés :) recepción –
sé que el mensaje es muy antiguo, pero tener una breve pregunta Utilizo exactamente su código dentro de mi aplicación pero el combobox personalizado no funciona. El nombre de la propiedad está atenuado y no hay opciones disponibles. Alguna idea, ¿qué puedo hacer para arreglar eso? Gracias de antemano, Martin – user653427
@ user653427, ya que esta es una vieja pregunta, también podría valer la pena para fijar una nueva pregunta y el enlace a esta página. Podrás dar más detalles y llegar a más personas de esa manera. –