2009-05-05 15 views
19

如何自定义PropertyGrid中类别的排序?如何在PropertyGrid上自定义类别排序?

如果我设置以下任一...

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

...那么类别将被按字母顺序排列。 (“按字母排序”似乎适用于每个类别中的属性。)如果我使用PropertySort.NoSort,则会丢失分类。

我填充我的PropertyGridSelectObject,这是很容易的:

this.propertyGrid1.SelectedObject = options; 

options是一类具有适当的装饰性的实例:

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

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

我有几十个属性在六个类别中。

有什么方法可以调整类别排序顺序,同时保留我的易用性SelectedObject

+0

看看这篇文章[CodeProject:属性网格中的排序项目](http://www.codeproject.com/Articles/6611/Ordering-Items-in-the-Property-Grid)。 – 2013-08-17 18:47:38

回答

4

如果您的意思是您希望按特定(非字母)方式排序的类别,那么不要 - 我认为您不能这样做。你可能想尝试VisualHint - 我期望它有这个(因为你可以抓住更多的控制)。

21

我觉得这个环节是非常有用的 http://bytes.com/groups/net-c/214456-q-ordering-sorting-category-text-propertygrid

我不相信有办法做到这一点。我唯一能找到的 表明你可以做到这一点是PropertySort 属性。如果将其设置为none,则表示按照从类型描述符收到的属性的顺序显示属性 。您可能是 能够在您的对象和 属性网格之间创建代理类型描述符,该属性网格然后将不仅返回正确的 订单中的属性,而且还返回它们所在的顺序中的类别属性。

+9

最后一招就是纯粹的邪恶天才; -p恶心,但如果它完成了工作...... – 2009-06-15 10:50:22

14

就像@ Marcle Gravel在his answer中说的,框架中没有任何东西允许这种行为。任何解决方案将是一个黑客。有了这个说法,您可以使用@Shahab建议的解决方案his answer作为解决方法,但这并不真正表明您有意维护您的代码。所以,我认为你能做的最好的是创建一个自定义AttributeCategoryAttribute继承处理过程中对您:

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

然后你可以使用它作为这样

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

只要确保你设定将PropertyGridUseCompatibletextRendering属性更改为true以删除您的非打印字符并将PropertySort设置为CategorizedCategorizedAlphabetical,您应该很好。

3

上面描述的'\ t'技巧的一个小变化,我只是试着用回车符('\ r')来代替它。它似乎可以工作,并避免由选项卡引入的额外空间导致的工具提示问题。