2011-01-07 8 views
2

Ich habe Klassen wie:Wie kann ich die Reihenfolge der ExpandableObject-Eigenschaften im Winforms-Eigenschaftsraster steuern?

[TypeConverterAttribute(typeof(ExpandableObjectConverter))] 
public class Inner 
{ 
    public string Before{get;set} 
    public string After(get;set} 
} 

public class Outer 
{ 
    public Inner Inner {get;set} 
} 

myPropertygrid.SelectedObject = new Outer(); 

Ich mag die Eigenschaften von „inneren“ wie „Before“ angezeigt werden sollte, „After“, scheint das Eigenschaftenraster sie um in alphabetischer Reihenfolge zu setzen und sie damit anzuzeigen, wie „ Nach "," Vorher "

Antwort

3

ich diese Lösung nicht mögen, aber es scheint zu funktionieren:

mit allen „Sortieren“

Erstellen einer Unterklasse von „PropertyDescriptorCollection“ Methoden außer Kraft setzen, nur um zurückzukehren „this“. Wenn also das Eigenschaftenraster sort aufruft, um die Reihenfolge der Eigenschaften zu ändern, passiert nichts.

Erstellen Sie eine Unterklasse von "ExpandableObjectConverter", bei der die Methode "GetProperties" überschrieben wurde, um eine Instanz von "NoneSortingPropertyDescriptorCollection" mit den Eigenschaften in der richtigen Reihenfolge zurückzugeben.

Verwenden Sie [TypeConverterAttribute (typeof (MyExpandableObjectConverter))], um Ihre Unterklasse von ExpandableObjectConverter zu verwenden.

public class NoneSortingPropertyDescriptorCollection : PropertyDescriptorCollection 
{ 
    public NoneSortingPropertyDescriptorCollection(PropertyDescriptor[] propertyDescriptors) 
     : base(propertyDescriptors) 
    { 
    } 

    public override PropertyDescriptorCollection Sort() 
    { 
     return this; 
    } 
    public override PropertyDescriptorCollection Sort(string[] names) 
    { 
     return this; 
    } 

    public override PropertyDescriptorCollection Sort(string[] names, System.Collections.IComparer comparer) 
    { 
     return this; 
    } 
    public override PropertyDescriptorCollection Sort(System.Collections.IComparer comparer) 
    { 
     return this; 
    } 
} 

public class MyExpandableObjectConverter : ExpandableObjectConverter 
{ 
    public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes) 
    { 
     PropertyDescriptorCollection d = base.GetProperties(context, value, attributes); 

     List<PropertyDescriptor> props = new List<PropertyDescriptor>(); 
     props.Add(d.Find("Before", false)); 
     props.Add(d.Find("After", false)); 

     NoneSortingPropertyDescriptorCollection m = new NoneSortingPropertyDescriptorCollection(props.ToArray()); 
     return m; 
    } 
} 

[TypeConverterAttribute(typeof(MyExpandableObjectConverter))]  
public class Inner  
{   
    public string Before{get;set}   
    public string After(get;set}  
}  
1

Verwenden Sie die Eigenschaft PropertyGrid.PropertySort, um die Reihenfolge der Eigenschaften zu ändern. Mögliche Werte sind wie folgt ...

NoSort 
Alphabetical 
Categorized 
CategorizedAlphabetical 

Ich würde für Sie die NOSORT als den entsprechenden Wert vorschlagen.

+0

Das würde bedeuten, das Verhalten zu überschreiben, wenn Sie von diesem Attribute erben können. – leppie

+0

Entschuldigung, dies wirkt sich auf die Reihenfolge aller Eigenschaften im Eigenschaftenraster aus, ich möchte nur die Reihenfolge der Eigenschaften auf dem "inneren Objekt" steuern und den Benutzer wie gewohnt die Reihenfolge der anderen Eigenschaften steuern lassen. –

+0

Nicht möglich, Sie können die Reihenfolge nur für alle angezeigten Eigenschaften ändern. –

1

weiß ich, das eine alte Frage, aber diese Lösung ist einfacher als die akzeptierte ein:

public class MyExpandableObjectConverter : ExpandableObjectConverter 
{ 
    public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes) 
    { 
     return TypeDescriptor.GetProperties(typeof(Inner), attributes).Sort(new[] { "Before", "After" }); 
    } 
} 

[TypeConverterAttribute(typeof(MyExpandableObjectConverter))] 
public class Inner 
{ 
    public string Before { get; set; } 
    public string After { get; set; } 
} 
Verwandte Themen