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();
    }
  }
}