如何在winforms属性网格中控制ExpandableObject属性的顺序?

时间:2011-01-07 09:31:58

标签: .net winforms propertygrid

我有类似的课程:

[TypeConverterAttribute(typeof(ExpandableObjectConverter))]
public class Inner
{
   public string Before{get;set}
   public string After(get;set}
}

public class Outer
{
    public Inner Inner {get;set}
}

myPropertygrid.SelectedObject = new Outer();

我希望“inner”的属性显示为“Before”,“After”,属性网格似乎按字母顺序排列,因此将它们显示为“After”,“Before”

3 个答案:

答案 0 :(得分:3)

我不喜欢这个解决方案,但似乎有效:

创建一个“PropertyDescriptorCollection”子类,所有“Sort”方法覆盖只是为了返回“this”。因此,只要属性网格调用sort来更改属性的顺序,就不会发生任何事情。

创建一个“ExpandableObjectConverter”的子类,该子类重写了“GetProperties”方法,返回“NoneSortingPropertyDescriptorCollection”实例,其属性顺序正确。

使用[TypeConverterAttribute(typeof(MyExpandableObjectConverter))]获取使用的ExpandableObjectConverter的子类。

public class NoneSortingPropertyDescriptorCollection : PropertyDescriptorCollection
{
    public NoneSortingPropertyDescriptorCollection(PropertyDescriptor[] propertyDescriptors)
        : base(propertyDescriptors)
    {
    }

    public override PropertyDescriptorCollection Sort()
    {
        return this;
    }
    public override PropertyDescriptorCollection Sort(string[] names)
    {
        return this;
    }

    public override PropertyDescriptorCollection Sort(string[] names, System.Collections.IComparer comparer)
    {
        return this;
    }
    public override PropertyDescriptorCollection Sort(System.Collections.IComparer comparer)
    {
        return this;
    }
}

public class MyExpandableObjectConverter : ExpandableObjectConverter
{
    public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes)
    {
        PropertyDescriptorCollection d = base.GetProperties(context, value, attributes);

        List<PropertyDescriptor> props = new List<PropertyDescriptor>();
        props.Add(d.Find("Before", false));
        props.Add(d.Find("After", false));

        NoneSortingPropertyDescriptorCollection m = new NoneSortingPropertyDescriptorCollection(props.ToArray());
        return m;
    }
}

[TypeConverterAttribute(typeof(MyExpandableObjectConverter))]      
public class Inner      
{         
   public string Before{get;set}        
   public string After(get;set}      
}    

答案 1 :(得分:2)

我知道这是一个老问题,但这个解决方案比公认的解决方案简单:

public class MyExpandableObjectConverter : ExpandableObjectConverter
{
    public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes)
    {
        return TypeDescriptor.GetProperties(typeof(Inner), attributes).Sort(new[] { "Before", "After" });
    }
}

[TypeConverterAttribute(typeof(MyExpandableObjectConverter))]
public class Inner
{
    public string Before { get; set; }
    public string After { get; set; }
}

答案 2 :(得分:1)

使用 PropertyGrid.PropertySort 属性更改属性的顺序。可能的值如下......

NoSort
Alphabetical
Categorized
CategorizedAlphabetical

我建议将 NoSort 作为适当的值。