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

时间:2009-05-05 04:21:08

标签: .net winforms propertygrid

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

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

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

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

我正在使用PropertyGrid填充SelectObject,这非常简单:

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的易用性?

5 个答案:

答案 0 :(得分:21)

我认为这个链接很有用 http://bytes.com/groups/net-c/214456-q-ordering-sorting-category-text-propertygrid

  

我不相信有办法做到这一点。我唯一能做到的   找到表明你可能能够做到这一点的是PropertySort   属性。如果将其设置为none,则表示显示属性   按照从类型描述符接收它们的顺序。你可能是   能够在您的对象和对象之间创建代理类型描述符   propertygrid,它不仅会返回正确的属性   订单,但具有所需订单类别的属性   他们在......

答案 1 :(得分:16)

就像@Marc Gravel在his answer中所说的那样,框架中没有任何内容允许这种行为。任何解决方案都是黑客攻击。话虽如此,您可以使用his answer中@Shahab建议的解决方案作为解决方法,但这并不能真正表明您对维护代码的任何人的意图。所以我认为你能做的最好的事情就是创建一个自定义Attribute,它继承自CategoryAttribute以便为你处理这个过程:

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;}

请确保将PropertyGrid的{​​{1}}媒体资源设置为UseCompatibletextRendering,以便为您删除不可打印的字符,并将true设置为PropertySortCategorized你应该好好去。

答案 2 :(得分:4)

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

答案 3 :(得分:3)

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

答案 4 :(得分:0)

所有其他答案都解决了如何自定义排序顺序,但没有解决用户点击分类字母按钮时出现的问题。< /p>

单击这些按钮会将 CategorizedAlphabeticalAlphabetical 值分配给 PropertySort 属性,而通常(至少对我而言)所需的行为是让它们分配 {{ 1}} 或 Categorized 值。

通过添加事件 Alphabetical 可以获得正确的行为:

PropertySortChanged

通过使用此事件,我没有看到工具提示的问题,因为我只将 private void propertyGrid1_PropertySortChanged(object sender, EventArgs e) { if (propertyGrid1.PropertySort == PropertySort.CategorizedAlphabetical) propertyGrid1.PropertySort = PropertySort.Categorized; } 放在类别名称的前面,而不是属性名称的前面。