Kategorien eines PropertyGrid's sortieren
Frank Dzaebel, erstellt am: 3.6.2005, zuletzt geändert:  5.12.2005
Kategorie: PropertyGrid, .NET-Version: 1.1/2.0

Während es unter .NET 1.1 noch den Trick der Benennung mit "\tErsteKategorie" und "\t\tZweiteKategorie" gab, ist Visual Studio 2005 diesbzgl. genauer geworden und zeigt diese Zeichen nun an, was den Trick ins Leere laufen lässt.
Eine kleine Korrektur-Methode kann den Umstand (für VS 2005) wieder rückführen.
(Der Code ist noch rudimentär, erfüllt aber schon seine Funktion).

Siehe auch:
-
Dynamische "Attribut-Änderung" beim PropertyGrid
- PropertyGrid zur Laufzeit mit dem TypeConverter beeinflussen

private void Form1_Load(object sender, EventArgs e)
{
  MyClass mc = new MyClass(); propertyGrid1.SelectedObject = mc;
  CorrectAllCategories(propertyGrid1);
}

private void CorrectAllCategories(PropertyGrid pg)
{
  object gridView = pg.GetType().InvokeMember("gridView", BindingFlags.NonPublic | 
    BindingFlags.GetField | BindingFlags.Instance, null, pg, null);
  GridItemCollection allGridEntries = (GridItemCollection)gridView.GetType(
     ).InvokeMember("allGridEntries",BindingFlags.NonPublic |
     BindingFlags.GetField | BindingFlags.Instance,null,gridView,null);
  for (int i = 0; i < allGridEntries.Count; i++)
  {
    if (allGridEntries[i].GridItemType != GridItemType.Category) continue;
    if (allGridEntries[i].Label.IndexOf('/') == -1) continue;
    allGridEntries[i].GetType().InvokeMember("name",BindingFlags.NonPublic |
       BindingFlags.SetField | BindingFlags.Instance,null,allGridEntries[i],
       new string[] { allGridEntries[i].Label.Split('/')[1] });
  }
}

class MyClass
{
   private int prop1 = 1;
   [Category("3/Erste Kategorie")]
   public int Prop1
   { get {return prop1;}
   }
   private int prop2 = 1;
   [Category("2/Zweite Kategorie")]
   public int Prop2
   { get {return prop2;}
   }
   private int prop3 = 1;
   [Category("1/Dritte Kategorie")]
   public int Prop3
   {  get {return prop3;}
   }
}