【问题标题】:How can I customize category sorting on a PropertyGrid?如何在 PropertyGrid 上自定义类别排序?
【发布时间】:2009-05-05 04:21:07
【问题描述】:

如何自定义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 的易用性?

【问题讨论】:

标签: .net winforms propertygrid


【解决方案1】:

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

我不相信有办法做到这一点。我唯一能做的 发现表明您可能能够做到这一点的是 PropertySort 财产。如果将其设置为无,则表示显示属性 按照从类型描述符接收它们的顺序。你可能是 能够在您的对象和 propertygrid,它不仅会返回正确的属性 顺序,但具有您想要的顺序的类别的属性 他们在...

【讨论】:

  • 最后的把戏是纯粹的邪恶天才;-p 讨厌,但如果它完成了工作......
  • 绝妙的把戏。但我发现虽然 \t 已从可视化显示中删除并且确实允许您控制排序,但它会混淆 PropertyGrid 的自动工具提示,因此它有时会认为它没有足够的空间来显示实际的属性名称做。更糟糕的是,工具提示保留了 \t - 所以当它出现时你会得到很多空白。
  • 与能够做到这一点的好处相比,工具提示的问题很小。很好的发现。
  • 我不知道你们是否看到了@JoelB 的答案(如下),但基本上是这个,但使用了类固醇。不过,就使用和可维护性而言,黑客行为要少得多。 :-)
【解决方案2】:

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

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,您应该是很好。

【讨论】:

  • 代替\t\u200B 可能更方便,它是一个空字符(无空格)
  • 我不明白为什么 PropertyGrid 控件会关心一个新的组成属性...是什么告诉 PropertyGrid 这个属性存在并且应该用于排序?
  • @FabriceT \u200B 对我不起作用。它在控件中不可见,但也不影响顺序。
  • 使用\r 来避免工具提示问题。
  • 首先我们在 C# 中。或者你复制隐形字符。 @Raimon 我确认它没有出现在工具提示中。 @Stensi 它是一个 Unicode 字符 \r 是 Windows 特定的 new line 字符,在 .Net Core 和 .Net Standard 中都没有用......我认为是这样......相反它更好而且可以安全使用 unicode 字符。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • \r 在 PropertyGrid 控件和工具提示中添加新行
    【解决方案5】:

    所有其他答案都解决了如何自定义排序顺序,但没有解决用户点击CategorizedAlphabetical按钮时出现的问题。

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

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

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

    通过使用此事件,我看不到工具提示的问题,因为我只将\t 放在类别名称前面,而不是在属性名称前面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-06
      • 2019-12-24
      • 1970-01-01
      • 2018-10-30
      • 1970-01-01
      相关资源
      最近更新 更多