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
|
|
}
|
|
} |