/// <summary>
/// 用来定义字段或属性的显示顺序
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Event)]
public class OrderAttribute : Attribute
{
/// <summary>
/// 显示顺序
/// </summary>
public int Index { get; protected set; }
public OrderAttribute(int index)
{
Index = index;
}
}
/// <summary>
///
/// </summary>
/// <param name="dgv"></param>
/// <param name="modelType"></param>
private void AdjustColumnOrder(DataGridView dgv, Type modelType)
{
if (dgv.Columns.Count == 0)
{
return;
}
Dictionary<string, int> dict = new Dictionary<string, int>();
var properties = modelType.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty);
foreach (var p in properties)
{
var orderAttr = (OrderAttribute)p.GetCustomAttribute(typeof(OrderAttribute));
if (orderAttr != null)
{
dict.Add(p.Name, orderAttr.Index);
}
}
var idxs = dict.OrderBy(r => r.Value).ToList();
foreach (var idx in idxs)
{
if (dgv.Columns.Contains(idx.Key))
{
dgv.Columns[idx.Key].DisplayIndex = idx.Value ;
}
}
}
public class Class1
{
[Order(3)]
public string A { get; set; }
[Order(4)]
public string B{ get; set; }
[Order(0)]
public string C { get; set; }
[Order(1)]
public string D { get; set; }
[Order(2)]
public string E{ get; set; }
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
var list = GetData();
dataGridView1.DataSource = list;
AdjustColumnOrder(dataGridView1, typeof(Class1));
}
/// <summary>
///
/// </summary>
/// <param name="dgv"></param>
/// <param name="modelType"></param>
private void AdjustColumnOrder(DataGridView dgv, Type modelType)
{
if (dgv.Columns.Count == 0)
{
return;
}
Dictionary<string, int> dict = new Dictionary<string, int>();
var properties = modelType.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty);
foreach (var p in properties)
{
var orderAttr = (OrderAttribute)p.GetCustomAttribute(typeof(OrderAttribute));
if (orderAttr != null)
{
dict.Add(p.Name, orderAttr.Index);
}
}
var idxs = dict.OrderBy(r => r.Value).ToList();
foreach (var idx in idxs)
{
if (dgv.Columns.Contains(idx.Key))
{
dgv.Columns[idx.Key].DisplayIndex = idx.Value ;
}
}
}
private List<Class1> GetData()
{
List<Class1> list = new List<Class1>()
{
new Class1{A="a",B="b",C="c",D="d",E="e"},
new Class1{A="a",B="b",C="c",D="d",E="e"},
new Class1{A="a",B="b",C="c",D="d",E="e"},
new Class1{A="a",B="b",C="c",D="d",E="e"},
new Class1{A="a",B="b",C="c",D="d",E="e"}
};
return list;
}
}