2009-05-05 24 views
19

Come personalizzare l'ordinamento delle categorie in un PropertyGrid?Come posso personalizzare l'ordinamento delle categorie su un PropertyGrid?

Se ho impostato una delle seguenti ...

propertyGrid.PropertySort = PropertySort.Categorized; 
propertyGrid.PropertySort = PropertySort.CategorizedAlphabetical; 

... poi le categorie saranno in ordine alfabetico. ("Alfabetico" sembrerebbe applicarsi alle proprietà all'interno di ciascuna categoria.) Se utilizzo PropertySort.NoSort, perdo la categorizzazione.

sto popolando il mio PropertyGrid con SelectObject, che è abbastanza facile:

this.propertyGrid1.SelectedObject = options; 

options è un'istanza di una classe con proprietà opportunamente decorati:

[CategoryAttribute("Category Title"), 
    DisplayName("Property Name"), 
    Browsable(true), 
    ReadOnly(false), 
    BindableAttribute(true), 
    DesignOnly(false), 
    DescriptionAttribute("...")] 
    public bool PropertyName { 
     get { 
      // ... 
     } 

     set { 
      // ... 
      this.OnPropertyChanged("PropertyName"); 
     } 
    } 

Ho qualche decina di proprietà in mezza dozzina di categorie.

C'è un modo per regolare l'ordinamento delle categorie mantenendo la facilità d'uso con SelectedObject?

+0

Dai un'occhiata a questo articolo [CodeProject: Ordinare elementi nella griglia proprietà] (http://www.codeproject.com/Articles/6611/Ordering-Items-in-theProperty-Grid). –

risposta

4

Se vuoi dire che vuoi che le categorie siano ordinate in modo specifico (non alfabetico), allora no - Non penso che tu possa farlo. Si potrebbe voler provare VisualHint - Mi aspetto che abbia questo (dal momento che è possibile ottenere un controllo molto più).

21

Penso che questo link è utile http://bytes.com/groups/net-c/214456-q-ordering-sorting-category-text-propertygrid

Non credo ci sia un modo per fare questo. L'unica cosa che potrei trovare su che indica che potresti essere in grado di farlo è la proprietà PropertySort . Se si imposta su none, si dice che le proprietà vengono visualizzate nell'ordine in cui vengono ricevute dal descrittore di tipi. Potrebbe essere in grado di creare un descrittore di tipo proxy tra l'oggetto e il propertygrid , che restituirebbe non solo le proprietà nell'ordine corretto , ma le proprietà con le categorie nell'ordine in cui si desidera in ..

+9

Il trucco finale in questo è puro genio del male ;-p Cattiva, ma se ottiene il lavoro fatto ... –

+1

Trucco eccellente. Ma ho scoperto che sebbene \ t sia rimosso dal display e ti permetta di controllare l'ordinamento, confonde la descrizione automatica del PropertyGrid in modo che a volte pensi che non abbia lo spazio completo per mostrare il nome della proprietà quando effettivamente lo fa. A peggiorare le cose, il suggerimento mantiene il \ t - così si ottiene un sacco di spazio bianco quando appare. – bsegraves

+2

Il problema con il tooltip è minore rispetto ai vantaggi di poterlo fare. Bella scoperta. – snae

14

Come @Marc Gravel ha detto in his answer, non c'è nulla nel framework che consente questo comportamento. Qualsiasi soluzione sarà un hack. Detto questo, è possibile utilizzare la soluzione suggerita da @Shahab in his answer come soluzione, ma ciò non indica in realtà l'intenzione dell'utente di mantenere il proprio codice. Quindi penso che la cosa migliore che puoi fare è creare un personalizzato Attribute che eredita da CategoryAttribute per gestire il processo per voi:

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)) 
    { 
    } 
} 

Quindi è possibile usarlo come tale

[CustomSortedCategory("Z Category",1,2)] 
public string ZProperty {set;get;} 
[CustomSortedCategory("A Category",2,2)] 
public string AProperty {set;get;} 

Basta fare in modo di impostare la proprietà di a true per rimuovere i caratteri non stampabili per voi e il PropertySort impostato su Categorized o CategorizedAlphabetical e si dovrebbe essere a posto.

3

Una piccola variazione sul trucco '\ t' descritto sopra, l'ho appena provato con caratteri di ritorno a capo ('\ r'). Sembra funzionare ed evita il problema del tooltip causato dallo spazio extra introdotto da una scheda.

Problemi correlati