23

如何自定义 a 中的类别排序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

4

5 回答 5

22

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

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

于 2009-06-15T10:43:33.883 回答
17

就像@Marc Gravel 在他的回答中所说的那样,框架中没有任何东西允许这种行为。任何解决方案都将是一个黑客。话虽如此,您可以使用@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'UseCompatibletextRendering属性设置true为为您去除不可打印的字符并将PropertySort设置为Categorizedor CategorizedAlphabetical,您应该很高兴。

于 2014-01-29T20:26:17.357 回答
4

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

于 2009-05-05T07:10:40.510 回答
4

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

于 2015-06-04T15:02:16.497 回答
0

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

单击这些按钮会将CategorizedAlphabeticalorAlphabetical值分配给PropertySort属性,而通常(至少对我而言)所需的行为是让他们分配CategorizedorAlphabetical值。

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

private void propertyGrid1_PropertySortChanged(object sender, EventArgs e)
{
    if (propertyGrid1.PropertySort == PropertySort.CategorizedAlphabetical)
        propertyGrid1.PropertySort = PropertySort.Categorized;
}

By using this event I don't see the problem with the tooltip, because I put the \t only in front of the category names, not in front of the property names.

于 2021-06-15T14:34:13.850 回答