CollectionEditor ohne PropertyGrid anzeigen
Frank Dzaebel, erstellt am:
3.09.2007, zuletzt geändert: 3.09.2007
Kategorie:Collections, .NET-Version:2.0, [Download]
Über ein PropertyGrid kann man Collection-Editoren mit einem
Klick auf [...] innerhalb des PropertyGrid's anzeigen. In diesem Artikel wird gezeigt,
wie man dies auch ohne PropertyGrid schafft.
using System;
using System.Windows.Forms;
using System.ComponentModel;
using System.Collections.Generic;
using System.Windows.Forms.Design;
using System.Drawing.Design;
using System.ComponentModel.Design;
namespace CollectionEdit
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnAuflistung_Click(object sender, EventArgs e)
{
PropertyDescriptor pd = TypeDescriptor.GetProperties(holder)["PersonenListe"];
UITypeEditor editor = (UITypeEditor)pd.GetEditor(typeof(UITypeEditor));
RuntimeServiceProvider serviceProvider = new RuntimeServiceProvider();
editor.EditValue(serviceProvider, serviceProvider, holder.PersonenListe);
}
private void btnCombo_Click(object sender, System.EventArgs e)
{
PropertyDescriptor pd = TypeDescriptor.GetProperties(comboBox1)["Items"];
UITypeEditor editor = (UITypeEditor)pd.GetEditor(typeof(UITypeEditor));
RuntimeServiceProvider serviceProvider = new RuntimeServiceProvider();
editor.EditValue(serviceProvider, serviceProvider, comboBox1.Items);
}
PersonenListe personen = new PersonenListe();
Holder holder;
private void Form1_Load(object sender, EventArgs e)
{
comboBox1.SelectedIndex = 0;
personen.Add(new Person("Josef", "Weizenbaum"));
personen.Add(new Person("John", "Neumannn"));
personen.Add(new Person("Niklaus", "Wirth"));
holder = new Holder(); holder.PersonenListe = personen;
}
[TypeConverter(typeof(ExpandableObjectConverter))]
class Person
{
public Person() { }
public Person(string vorname, string nachname)
{
this.vorname = vorname;
this.nachname = nachname;
}
private string vorname = "";
[Description("Der Vorname")]
public string Vorname
{
get { return vorname; }
set { vorname = value; }
}
private string nachname="";
[Description("Der Nachname")]
public string Nachname
{
get { return nachname; }
set { nachname = value; }
}
}
class Holder
{
PersonenListe personenListe;
[Description("Eine Liste von Personen")]
public PersonenListe PersonenListe
{
get { return personenListe; }
set { personenListe = value; }
}
}
public class RuntimeServiceProvider : IServiceProvider, ITypeDescriptorContext
{
object IServiceProvider.GetService(Type serviceType)
{
if (serviceType == typeof(IWindowsFormsEditorService))
return new EditorService();
return null;
}
class EditorService : IWindowsFormsEditorService
{
public void DropDownControl(Control control) { }
public void CloseDropDown() { }
public System.Windows.Forms.DialogResult ShowDialog(Form dialog)
{
return dialog.ShowDialog();
}
}
public void OnComponentChanged() { }
public IContainer Container { get { return null; } }
public bool OnComponentChanging()
{
return true; //um Änderungen zu behalten ..
}
public object Instance { get { return null; } }
public PropertyDescriptor PropertyDescriptor
{
get { return null; }
}
}
[Editor(typeof(CollectionEditor), typeof(UITypeEditor))]
[Description("Eine Personenliste")]
class PersonenListe : List<Person>
{
public PersonenListe() { }
}
private void btnBeenden_Click(object sender, EventArgs e)
{
this.Close();
}
}
}