Wie kann ich Kategorie Sortierung auf einem Property anpassen?
-
05-07-2019 - |
Frage
Wie kann ich die Sortierung der Kategorien in einem PropertyGrid
anpassen?
Wenn ich gesetzt eine der folgenden ...
propertyGrid.PropertySort = PropertySort.Categorized;
propertyGrid.PropertySort = PropertySort.CategorizedAlphabetical;
... dann werden die Kategorien alphabetisch geordnet. ( „Alphabetisch“ scheint auf die Eigenschaften innerhalb jeder Kategorie zu beantragen.) Wenn ich PropertySort.NoSort
verwenden, ich Kategorisierung verlieren.
Ich bin bevölkern meine PropertyGrid
mit SelectObject
, die recht einfach:
this.propertyGrid1.SelectedObject = options;
options
ist eine Instanz einer Klasse mit entsprechend eingerichteten Eigenschaften:
[CategoryAttribute("Category Title"),
DisplayName("Property Name"),
Browsable(true),
ReadOnly(false),
BindableAttribute(true),
DesignOnly(false),
DescriptionAttribute("...")]
public bool PropertyName {
get {
// ...
}
set {
// ...
this.OnPropertyChanged("PropertyName");
}
}
Ich habe ein paar Dutzend Objekte in einem halben Dutzend Kategorien.
Gibt es irgendeine Weise, die ich die Kategorie Sortierreihenfolge einstellen kann, während meine einfache Bedienung mit SelectedObject
bewahren?
Lösung
Wenn Sie meinen, dass Sie die Kategorien in einer bestimmten (nicht alphabetisch) Art und Weise sortiert werden sollen, dann nein - ich glaube nicht, dass Sie das tun können. Sie könnten versuchen wollen VisualHint - Ich erwarte, dass es dies tut haben (da kann man beschlagnahmen viel mehr Kontrolle).
Andere Tipps
Ich denke, diese Verbindung nützlich ist http://bytes.com/groups/ net-c / 214456-q-Ordering-Sortierung-Kategorie-text-Property
Ich glaube nicht, gibt es eine Möglichkeit, dies zu tun ist. Das einzige, was ich konnte, finden, die angibt, was Sie tun dies ist der PropertySort könnten in der Lage sein, Eigentum. Wenn Sie es auf none gesetzt, heißt es, dass die Eigenschaften angezeigt werden in der Reihenfolge, dass sie von dem Typdeskriptor empfangen. Du könntest sein der Lage, einen Proxy-Typdeskriptor zwischen Ihrem Objekt zu erstellen und die Property, die dann nicht nur die Eigenschaften in der richtigen zurückkehren Ordnung, aber die Eigenschaften mit den Kategorien in der Reihenfolge, die Sie wollen sie in ...
Wie @Marc Gravel in seine Antwort , gibt es nichts, im Rahmen, die dieses Verhalten ermöglicht. Jede Lösung wird ein Hack. Nachdem dies gesagt wurde, können Sie die Lösung von @Shahab in seine Antwort als Behelfslösung aber das bedeutet nicht Ihren Wunsch, jede Aufrechterhaltung des Code wirklich. Also ich denke, das Beste, was Sie tun können, ist eine benutzerdefinierte Attribute
erstellen, die von CategoryAttribute
erbt den Prozess für Sie zu behandeln:
public class CustomSortedCategoryAttribute : CategoryAttribute
{
private const char NonPrintableChar = '\t';
public CustomSortedCategoryAttribute( string category,
ushort categoryPos,
ushort totalCategories)
: base(category.PadLeft(category.Length + (totalCategories - categoryPos),
CustomSortedCategoryAttribute.NonPrintableChar))
{
}
}
Dann können Sie es als solche verwenden
[CustomSortedCategory("Z Category",1,2)]
public string ZProperty {set;get;}
[CustomSortedCategory("A Category",2,2)]
public string AProperty {set;get;}
So stellen Sie sicher, dass Sie die PropertyGrid
der UseCompatibletextRendering
Eigenschaft, die nicht druckbare Zeichen für Sie abzustreifen, um true
und die PropertySort
Categorized
oder CategorizedAlphabetical
gesetzt, und Sie sollten gut gehen.
Eine kleine Variante des ‚\ t‘ Trick oben beschrieben, ich habe gerade versuchte es mit Carriage Return-Zeichen ( ‚\ r‘) statt. Es scheint zu funktionieren und vermeidet das Tooltip Problem durch den zusätzlichen Platz durch eine Lasche eingeführt verursacht.