66 lines
2.3 KiB
C#
66 lines
2.3 KiB
C#
|
using System;
|
|||
|
using System.Collections;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.ComponentModel;
|
|||
|
using System.Linq;
|
|||
|
using System.Text;
|
|||
|
using System.Threading.Tasks;
|
|||
|
using ProductionControl.UI;
|
|||
|
|
|||
|
namespace ProductionControl.UI.PropExtend
|
|||
|
{
|
|||
|
public class PropertySorter : ExpandableObjectConverter
|
|||
|
{
|
|||
|
#region Methods
|
|||
|
public override bool GetPropertiesSupported(ITypeDescriptorContext context)
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes)
|
|||
|
{
|
|||
|
//
|
|||
|
// This override returns a list of properties in order
|
|||
|
//
|
|||
|
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(value, attributes);
|
|||
|
ArrayList orderedProperties = new ArrayList();
|
|||
|
foreach (PropertyDescriptor pd in pdc)
|
|||
|
{
|
|||
|
Attribute attribute = pd.Attributes[typeof(PropertyOrderAttribute)];
|
|||
|
if (attribute != null)
|
|||
|
{
|
|||
|
//
|
|||
|
// If the attribute is found, then create an pair object to hold it
|
|||
|
//
|
|||
|
PropertyOrderAttribute poa = (PropertyOrderAttribute)attribute;
|
|||
|
orderedProperties.Add(new PropertyOrderPair(pd.Name, poa.Order));
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
//
|
|||
|
// If no order attribute is specifed then given it an order of 0
|
|||
|
//
|
|||
|
orderedProperties.Add(new PropertyOrderPair(pd.Name, 0));
|
|||
|
}
|
|||
|
}
|
|||
|
//
|
|||
|
// Perform the actual order using the value PropertyOrderPair classes
|
|||
|
// implementation of IComparable to sort
|
|||
|
//
|
|||
|
orderedProperties.Sort();
|
|||
|
//
|
|||
|
// Build a string list of the ordered names
|
|||
|
//
|
|||
|
ArrayList propertyNames = new ArrayList();
|
|||
|
foreach (PropertyOrderPair pop in orderedProperties)
|
|||
|
{
|
|||
|
propertyNames.Add(pop.Name);
|
|||
|
}
|
|||
|
//
|
|||
|
// Pass in the ordered list for the PropertyDescriptorCollection to sort by
|
|||
|
//
|
|||
|
return pdc.Sort((string[])propertyNames.ToArray(typeof(string)));
|
|||
|
}
|
|||
|
#endregion
|
|||
|
}
|
|||
|
}
|