Wie ändert man ein propertygrid zur Laufzeit in jeder Hinsicht? Ich möchte in der Lage sein, Eigenschaften hinzuzufügen und zu entfernen und "dynamische Typen" hinzuzufügen, was ich damit meine, ist ein Typ, der zu einem Laufzeit-erzeugten Dropdown in dem propertygrid führt, das einen TypeConverter verwendet.So ändern Sie PropertyGrid zur Laufzeit (Eigenschaft hinzufügen/entfernen und dynamische Typen/enums)
Ich konnte diese beiden Dinge tatsächlich tun (Eigenschaften hinzufügen/entfernen und dynamischen Typ hinzufügen), aber nur getrennt und nicht gleichzeitig.
Um die Unterstützung zum Hinzufügen und Entfernen von Eigenschaften zur Laufzeit zu implementieren, habe ich this codeproject article verwendet und den Code ein bisschen geändert, um verschiedene Typen (nicht nur Zeichenfolgen) zu unterstützen.
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
}
Meine Komplettlösung here heruntergeladen werden.
Es funktioniert gut, wenn ich Strings, Bools oder Enums hinzufügen, aber wenn ich versuche, einen "dynamischen Typ" wie StatesList hinzuzufügen, funktioniert es nicht. Weiß jemand warum und kann mir helfen, es zu lösen?
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;
}
}
Verfahren zur Herstellung eines Typeconverter mit funktioniert gut, wenn Sie nicht versuchen, die Eigenschaft zur Laufzeit hinzufügen, zum Beispiel this code funktioniert ohne Probleme, aber ich möchte in der Lage sein, beides zu tun.
Bitte werfen Sie einen Blick auf my project. Danke!
Sie sind willkommen :) –
Ich weiß, dass die Post ist sehr alt, aber ich habe eine kurze Frage. Ich benutze genau Ihren Code innerhalb meiner Anwendung, aber die benutzerdefinierte Combobox funktioniert nicht. Der Name der Eigenschaft ist ausgegraut und es sind keine Optionen verfügbar. Irgendeine Idee, was ich tun kann, um das zu beheben? Vielen Dank im Voraus, Martin – user653427
@ user653427, Da dies so eine alte Frage ist, könnte es auch wert sein, eine neue Frage zu stellen und auf diese Seite verlinken. Sie können mehr Details angeben und mehr Menschen auf diese Weise erreichen. –