2009-05-05 17 views
19

¿Cómo puedo personalizar la clasificación de categorías en un PropertyGrid?¿Cómo puedo personalizar la clasificación de categorías en un PropertyGrid?

Si fijo alguna de las siguientes ...

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

... entonces se ordena alfabéticamente las categorías. ("Alfabético" parece aplicarse a las propiedades dentro de cada categoría.) Si uso PropertySort.NoSort, pierdo categoría.

estoy poblando mi PropertyGrid con SelectObject, que es bastante fácil:

this.propertyGrid1.SelectedObject = options; 

options es una instancia de una clase con propiedades convenientemente decorados:

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

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

tengo unas pocas docenas de propiedades en media docena de categorías.

¿Hay alguna manera de que pueda ajustar el orden de clasificación de categoría mientras se preserva mi facilidad de uso con SelectedObject?

+0

Eche un vistazo a este artículo [CodeProject: pedidos de elementos en la cuadrícula de propiedades] (http://www.codeproject.com/Articles/6611/Ordering-Items-in-the-Property-Grid). –

Respuesta

4

Si quieres decir que quieres las categorías ordenadas de una manera específica (no alfabética), entonces no, no creo que puedas hacer eso. Es posible que desee probar VisualHint - Supongo que tiene esto (ya que puede aprovechar mucho más control).

21

Creo que este enlace es útil http://bytes.com/groups/net-c/214456-q-ordering-sorting-category-text-propertygrid

No creo que hay una manera de hacer esto. Lo único que pude encontrar que indica que podría hacer esto es la propiedad PropertySort . Si lo configura en ninguno, dice que las propiedades se muestran en el orden en que se reciben del descriptor de tipo. Puede ser capaz de crear un descriptor de tipo de proxy entre su objeto y la propiedad , que luego devolvería no solo las propiedades en el orden correcto , sino también las propiedades con las categorías en el orden en que desea . .

+9

El truco final en eso es genio malvado puro ;-p Malo, pero si hace bien el trabajo .... –

+1

Excelente truco. Pero descubrí que aunque \ t se elimina de la pantalla visual y le permite controlar la ordenación, confunde la información sobre herramientas automática para PropertyGrid, por lo que algunas veces piensa que no tiene el espacio completo para mostrar el nombre de la propiedad cuando en realidad hace. Para empeorar las cosas, la punta de la herramienta conserva el \ t - por lo que se obtiene un montón de espacio en blanco cuando aparece. – bsegraves

+2

El problema con la información sobre herramientas es menor en comparación con los beneficios de poder hacer esto. Buen hallazgo – snae

14

Como @Marc Grava dijo en his answer, no hay nada en el marco que permite este comportamiento. Cualquier solución será un truco. Dicho esto, puede utilizar la solución sugerida por @Shahab en his answer como solución alternativa, pero eso no indica realmente su intención a nadie que mantenga su código. Así que creo que lo mejor que puede hacer es crear una costumbre Attribute que hereda de CategoryAttribute para manejar el proceso para usted:

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

entonces puede utilizar como tal

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

Sólo asegúrese de configurar la propiedad PropertyGridUseCompatibletextRendering a true para eliminar los caracteres no imprimibles para usted y PropertySort establecidos en Categorized o CategorizedAlphabetical y debe estar listo para continuar.

3

Una pequeña variación del truco '\ t' descrito anteriormente, en su lugar lo intenté con caracteres de retorno de carro ('\ r'). Parece que funciona y evita el problema de información sobre herramientas causado por el espacio adicional introducido por una pestaña.

Cuestiones relacionadas