前言
今天跟大家分享的主題是基于自定義特性實現(xiàn)DataGridView全自動生成。
實現(xiàn)過程
這里是在上一篇文章《給你的屬性加個說明》的基礎(chǔ)上,對其做進一步應用。
給你的屬性加個說明
首先創(chuàng)建一個窗體應用,在窗體里拖放一個DataGridView控件和一個生成數(shù)據(jù)的按鈕,將DataGridView控件的啟用添加、啟用編輯、啟用刪除的勾選都去掉。
后臺編寫一個初始化DataGridView的方法,代碼如下。
private void InitialDataGridView()
{
Type t = typeof(Points);
foreach (PropertyInfo pi in t.GetProperties())
{
//獲取屬性名稱
string propertyName = pi.Name;
//獲取顯示文本
string displayName = pi.GetCustomAttribute<CustomAttribute>()?.DisplayName;
//獲取顯示寬度
int displayWidth = pi.GetCustomAttribute<CustomAttribute>().DisplayWidth;
DataGridViewTextBoxColumn column = new DataGridViewTextBoxColumn()
{
HeaderText = displayName,
Width = displayWidth,
DataPropertyName = propertyName,
SortMode = DataGridViewColumnSortMode.NotSortable,
AutoSizeMode = DataGridViewAutoSizeColumnMode.NotSet
};
this.dgvMain.Columns.Add(column);
}
}
然后在構(gòu)造方法里初始化調(diào)用一下:
public FrmMain()
{
InitializeComponent();
this.dgvMain.AutoGenerateColumns = false;
InitialDataGridView();
}
接著在生成數(shù)據(jù)按鈕添加一些數(shù)據(jù),代碼如下:
private void btn_Generate_Click(object sender, EventArgs e)
{
List<Points> Points = new List<Points>();
for (int i = 1; i < 10; i++)
{
Points.Add(new Points()
{
StationNo = "站點" + 1,
TD_P1 = 123,
TD_P2 = 456,
});
}
this.dgvMain.DataSource = null;
this.dgvMain.DataSource = Points;
}
點擊生成數(shù)據(jù)按鈕,效果如下:
這樣就實現(xiàn)了動態(tài)生成DataGridView控件,后續(xù)如果需要更改名稱或者增加列,直接去實體類修改即可,不需要再去修改DataGridView了。
這種方式非常適用于列數(shù)非常多且不確定因素非常多的情況,比如配方應用等。