Disclaimer The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.
Über das PropertyGrid-Control habe ich ja mehrmals gebloggt (z.B. hier). Dieses Control verwendie ich recht häufig um z.B. den Inhalt eigene Konfigurations-Klassen zu editieren. Zusammen mit der XML-Serialisierung lassen sich so sehr flexible Konfigurationsmöglichkeiten schaffen.
Nun hatte ich die Anforderung eine dynamische Datenstruktur an ein PropertyGrid zu binden. Da stand ich zunächst vor einem Problem. Bisher habe ich nur Objekte mit Properties unterschiedlicher Typen an das PropertyGrid gebunden. Nun habe ich eine Liste von Objekten, die die Elemente im PropertyGrid beschreiben. Wie aber diese an das PropertyGrid binden?
Das schöne ist, das das PropertyGrid sich hier als sehr flexibel erweist. Man muss folgende Schritte durchführen:
1: private void Form1_Load(object sender, EventArgs e)
2: {
3: cPropertyCollection props = new cPropertyCollection();
4: props.Add(new cPropertyItem("BoolValue", "This is a boolean value", false, true, "Properties"));
5: props.Add(new cPropertyItem("StringValue", "This is a string value", false, "Test123", "Properties"));
6: props.Add(new cPropertyItem("Folder", "Path for folder", false, "", "Path"));
7:
8: this.artisoPropertyGrid1.SelectedObject = props;
9: }
Damit erhält man folgendes Ergebnis. Man sieht die dynamisch angelegten Properties mit ihrem Name, in die Kategorien untergliedert und mit der Beschreibung. Das PropertyGrid wählt automatisch die gewohnten Controls abhängig vom Datentyp aus.
Dis ist schon ganz nett. Ich möchte aber für das Folder-Property einen entsprechenden Editor angeben können. Bei statischen Klassen vrwendet man einfach Attribute, aber bei dynamischen? Dazu wird die verfügbare Dokumentation sehr, sehr dünn. Hierzu haben wir auf der Property-Klasse eine Attribute-Arary. Diese Attribute können wir nun in der GetProperties-Klasse an den cCostomPropertyDescriptor übergeben. Der Aufbau der Properties sieht dann so aus:
6: props.Add(new cPropertyItem("Folder", "Path for folder", false, "", "Path",
7: new TypeConverterAttribute(),
8: new EditorAttribute(typeof(System.Windows.Forms.Design.FolderNameEditor), typeof(System.Drawing.Design.UITypeEditor))));
9:
10: this.artisoPropertyGrid1.SelectedObject = props;
11: }
Nun kann man im Feld für den Wert für das Property "Folder" auf einen Button klicken und erhält einen Dialog zur Auswahl eines Verzeichnisses.
Den kompletten Quellcode kann man hier herunterladen.
Remember Me