Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何在PropertyGrid上自定义类别排序?_.net_Winforms_Propertygrid - Fatal编程技术网

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

.net 如何在PropertyGrid上自定义类别排序?,.net,winforms,propertygrid,.net,Winforms,Propertygrid,如何自定义PropertyGrid中的类别排序 如果我设置以下任一项 propertyGrid.PropertySort = PropertySort.Categorized; propertyGrid.PropertySort = PropertySort.CategorizedAlphabetical; 。。。然后,类别将按字母顺序排列。(“字母顺序”似乎适用于每个类别中的属性。)如果我使用PropertySort.NoSort,我将丢失分类 我正在用SelectObject填充我的Pro

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

如果我设置以下任一项

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

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

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

如果你的意思是你想要以一种特定的(非字母顺序的)方式对类别进行排序,那么不-我认为你做不到。你可能想试试——我想它确实有这个功能(因为你可以获得更多的控制权)。

我认为这个链接很有用

我不相信有办法做到这一点。我唯一能做的就是 查找表明您可能能够执行此操作的是PropertySort 财产。如果将其设置为“无”,则表示将显示属性 按照从类型描述符接收它们的顺序。你可能是 能够在您的对象和 propertygrid,它将不仅返回正确格式中的属性 顺序,但类别的属性按所需顺序排列 他们在

正如@Marc Grasser在中所说,框架中没有允许这种行为的内容。任何解决方案都将是一次黑客攻击。话虽如此,您可以使用中@Shahab建议的解决方案作为解决方案,但这并不能真正向任何维护代码的人表明您的意图。因此,我认为您最好创建一个自定义
属性
,该属性继承自
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
设置为
CategorizedAlphabetial
即可。这是“\t”的一个小变化上面描述的技巧,我只是用回车符('\r')来代替。它似乎可以工作,并避免了由选项卡引入的额外空间导致的工具提示问题。

这方面的最后一个技巧是纯粹的邪恶天才-p很讨厌,但如果它完成了任务…很好的把戏。但我发现,尽管\t已从可视化显示中删除,并允许您控制排序,但它会混淆PropertyGrid的自动工具提示,因此它有时认为在实际显示属性名称时没有足够的空间来显示属性名称。更糟糕的是,工具提示保留了\t-,因此当它出现时会有很多空白。与能够这样做的好处相比,工具提示的问题很小。很好的发现。也看看这篇文章。我不知道你们是否看到了@JoelB的答案(见下图),但基本上是这个答案,只是服用了类固醇。就使用和可维护性而言,黑客行为要少得多。:-)请看这篇文章。
\t
\u200B
可能更方便,它是一个空字符(没有空格)