一、构建特性类:
using System;
namespace AttributeDemo
{
//特性应用在属性上,不允许多行
[AttributeUsage(AttributeTargets.Property, AllowMultiple=false, Inherited=false)]
public class ColumnAttribute : Attribute
{
public ColumnAttribute(bool visible, bool readOnly, int width)
{
this.visible = visible;
this.readOnly = readOnly;
this.width = width;
}
private bool visible;
public bool Visible
{
get { return visible; }
}
private bool readOnly;
public bool ReadOnly
{
get { return readOnly; }
}
private int width;
public int Width
{
get { return width; }
}
public string HeaderText { get; set; }
//标记为DataGridView中是否含有此栏目
public bool IsNotShow { get; set; }
//显示格式
public string Format { get; set; }
//DataGridViewTextBoxColumn的最新宽度必须是2
private int? mininumWidth;
public int MininumWidth
{
get
{
int length = mininumWidth == null ? 0 : (int)mininumWidth;
length = length < 2 ? 2 : length;
return length;
}
set { mininumWidth = value; }
}
}
}
二、使用特性类
using System; using System.Windows.Forms; namespace AttributeDemo { public class Student { //DataGridView包含此栏目,但不显示 [Column(false, true, 80, HeaderText = "学号")] public string StudentNo { get; set; } [Column(true, false, 80, HeaderText="姓名")] public string Name { get; set; } [Column(true, true, 120, HeaderText = "出生日期", Format="yyyy年MM月dd日")] public DateTime BornDate { get; set; } [Column(true, true, 100, HeaderText = "电话")] public string Telephone { get; set; } //DataGridView不包含此栏目 [Column(true, true, 120, IsNotShow=true )] public string Memo { get; set; } public static DataGridViewTextBoxColumn[] GetColumns() { ColumnHelper columnHelper = new ColumnHelper(); return columnHelper.GetColumnArray(typeof(Student)); } } }
三、从实体类的属性的特性中读取栏目DataGridViewTextBoxColumn信息
using System; using System.Collections.Generic; using System.Windows.Forms; using System.Reflection; namespace AttributeDemo { public class ColumnHelper { public DataGridViewTextBoxColumn[] GetColumnArray(Type t) { List<DataGridViewTextBoxColumn> list = new List<DataGridViewTextBoxColumn>(); foreach (PropertyInfo info in t.GetProperties()) { ColumnAttribute columnAttribute = info.GetCustomAttributes(false)[0] as ColumnAttribute; DataGridViewTextBoxColumn column = GetColumn(info.Name, columnAttribute); if(column != null) list.Add(column); } return list.ToArray(); } private DataGridViewTextBoxColumn GetColumn(string columnName, ColumnAttribute columnAttribute) { if (columnAttribute.IsNotShow) return null; DataGridViewTextBoxColumn column = new DataGridViewTextBoxColumn(); column.Name = columnName; column.DataPropertyName = columnName; column.Visible = columnAttribute.Visible; column.ReadOnly = columnAttribute.ReadOnly; column.Width = columnAttribute.Width; column.HeaderText = columnAttribute.HeaderText; column.DefaultCellStyle.Format = columnAttribute.Format; column.MinimumWidth = columnAttribute.MininumWidth; return column; } } }
四、构造数据
using System; using System.Collections.Generic; namespace AttributeDemo { public class DataInfo { public List<Student> GetStudent() { List<Student> list = new List<Student>(); list.Add(new Student() { StudentNo = "0001", Name = "张三", BornDate = DateTime.Now.AddYears(-20), Telephone = "66666666", Memo = "测试一" }); list.Add(new Student() { StudentNo = "0002", Name = "李四", BornDate = DateTime.Now.AddYears(-19), Telephone = "88888888", Memo = "测试二" }); return list; } } }
五、使用就相当简单,在窗体上拖一个DataGridView控件。
using System; using System.Collections.Generic; using System.Windows.Forms; namespace AttributeDemo { public partial class Form1 : Form { public Form1() { InitializeComponent(); InitColumn(); } private void InitColumn() { this.dataGridView1.AutoGenerateColumns = false; DataGridViewTextBoxColumn[] columnArray = Student.GetColumns(); this.dataGridView1.Columns.AddRange(columnArray); } private void Form1_Load(object sender, EventArgs e) { DataInfo dataInfo = new DataInfo(); List<Student> list = dataInfo.GetStudent(); this.dataGridView1.DataSource = list; } } }
运行效果: