999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

讓DataGridView智能生成列集

2014-07-29 05:09:54汪瑩
中國新通信 2014年7期

【摘要】 DataGridView是一個非常實用的顯示和編輯多行數據的控件,通過對它進行適當的擴展后,使它可以智能地根據數據源的基礎類型有選擇地自動生成列,如果想要對顯示的列集進行變動,只要修改邏輯層中對應的基礎類型的屬性即可,表現(xiàn)層不要作任何修改,大大地提高了工作效率,而且避免了出錯的可能,這完全符合代碼和表現(xiàn)分離的設計理念。

【關鍵詞】 智能生成列 C# 組件 DataGridView 泛型函數 反射

一、引言

NET Framework 類庫提供的 DataGridView 控件,可以顯示和編輯來自多種不同類型的數據源的表格數據。深受編程人員的喜愛。它有兩種生成列集的方式:當AutoGenerateColumns設置為false時(此為默認設置),由用戶手動生成列集,當AutoGenerateColumns設置為true時,由DataGridView根據數據源自動生成列集。第二種方式簡單方便,但它是無選擇地將數據源所有的列對象都顯示出來,在很多場合下是不符合用戶的要求的。第一種方式雖然靈活有選擇,但必須逐個地生成每一個列對象,很麻煩,當數據源的列對象數比較大時更是如此,而且當數據源的列對象名稱有變化時,還必須得手動更新DataGridView的列集中對應的列,不僅費時費力,而且很容易出錯。

二、思路

為了讓DataGridView能夠識別哪些列需要顯示,哪些列不需要顯示,可在給數據源的基礎類型的列屬性取名時做好特別的記號。筆者是讓需要顯示的列屬性的名稱前面加上由下劃線分隔的前綴。如下所示,Empolyee有兩個公開屬性,其中 “P_是否在崗”這個列屬性有前綴”P”表示需要生成列對象進行顯示,“籍貫”這列屬性沒有前綴表示不需要顯示:

public class Empolyee

{

private Boolean _是否在崗;

public Boolean P_是否在崗

{

get { return _是否在崗; }

set { _是否在崗 = value; }

}

private string _籍貫 = "";

public string 籍貫

{

get { return _籍貫; }

set

{

if (_籍貫 != value)

{

_籍貫 = value;

}

}

}

}

然后創(chuàng)建一個組件,讓這個組件繼承自DataGridView并擴展一個泛型函數GenerateColumns()。在此函數中,依據NET Framework的反射機理,通過Type的GetProperties()獲取T的屬性名稱數組進行掃描分析,如果名稱包含由下劃線分隔的前綴,則生成對應的列對象,否則略過而不生成。實際使用時,只要在窗體中放入這個組件,然后只要簡單地用語句GenerateColumns()調用組件的這個泛型函數就可以實現(xiàn)有選擇地顯示Empolyee的列對象;

將這個組件編譯成DLL類庫以便重復使用。

三、應用實例

本文以Microsoft Visual Studio 2005集成環(huán)境中的C#語言為例,說明具體操作技術。

新建一個項目,選擇”類庫”模板,且項目取名為”MyLibrary”,然后添加對 “System.Windows.Forms”和” System.Drawing”的引用,最后將其中代碼改成如下內容并生成類庫文件MyLibrary.dll備用,然后關閉包含此項目的解決方案。

using System;

using System.ComponentModel;

using System.Collections.Generic;

using System.Diagnostics;

using System.Text;

using System.Reflection;

using System.Windows.Forms;

using System.Drawing;

namespace MyToolsBox

{

///

public partial class MyDataGridView : DataGridView

{

public MyDataGridView()

{

InitializeComponent();

this.AutoGenerateColumns = false;

}

///

根據類別公共屬性名稱,自動生成列對象集

/// 屬性名稱必須是由下劃線相連的兩部分組成的

/// 第二部分(建議用漢字)將成為生成列的標題

/// 如果是布爾型,則使用DataGridViewCheckBoxColumn列

/// 如果是日期型,則使用自定義的CalendarColumn列

/// 其它類型,則使用DataGridViewTextBoxColumn列

/// 泛型類型參數

public void GenerateColumns()

{

DataGridViewColumn col;

Type MyType = typeof(T);

PropertyInfo[] Mypropertyinfo = MyType.GetProperties();

foreach (PropertyInfo n in Mypropertyinfo)

{

int x = n.Name.IndexOf('_');

if (x > 0 && x + 1 < n.Name.Length)//有前綴

{

if (n.PropertyType == typeof(System.Boolean))

col = new DataGridViewCheckBoxColumn();

else if (n.PropertyType == typeof(System.DateTime))

col = new CalendarColumn();//此句使用了筆者自定義的日期類型列CalendarColumn,必須在類庫中包含了對它的定義,讀者在調試時可將此行注釋

else

col = new DataGridViewTextBoxColumn();

col.Name =

col.DataPropertyName = n.Name;

col.HeaderText = n.Name.Substring(x + 1);

this.Columns.Add(col);

}

}

}

}

}

再新建一個項目, 選擇”Windows 應用程序”模板,且將項目取名為”Demo” ,在此項目中,添加一個”新建項”,選擇”類”模板,并取名為Empolyee,然后將類代碼改成如下內容:

namespace Demo

{

public class Empolyee

{

private string _檔案編號 = "";

public string P_檔案編號

{

get { return _檔案編號; }

}

private string _姓名 = "";

public string P_姓名

{

get { return _姓名; }

}

private string _工作單位 = "";

public string P_工作單位

{

get { return _工作單位; }

}

private DateTime _出生日期 = System.DateTime.Now.Date;

public DateTime P_出生日期

{

set

{

if (_出生日期 != value)

_出生日期 = value;

}

get { return _出生日期;}

}

private string _移動電話 = "";

public string P_移動電話

{

get { return _移動電話; }

set

{

if (_移動電話 != value)

{

_移動電話 = value;

}

}

}

private Boolean _是否在崗;

public Boolean P_是否在崗

{

get { return _是否在崗; }

set { _是否在崗 = value; }

}

private string _籍貫 = "";

public string 籍貫

{

get { return _籍貫; }

set

{

if (_籍貫 != value)

{

_籍貫 = value;

}

}

}

///

生成并返回演示數據

///

static public List GetDemoList()

{

List list = new List();

Empolyee t = new Empolyee();

t._檔案編號 = "200018";

t._姓名 = "汪瑩";

t._工作單位 = "黎川縣職業(yè)中專";

t._出生日期 = System.DateTime.Parse("1984-01-01");

t._移動電話 = "13812345678";

t._籍貫 = "江西省黎川縣";

list.Add(t);

return list;

}

}

}

在項目中添加對剛才生成的“MyLibrary.dll”的引用。

在項目中打開Form1.cs[設計]界面,右擊工具箱,在彈出的快捷菜單中執(zhí)行”添加選項卡”命令,并將新生成的選項卡命名為”MyToolsBox”,然后將“MyLibrary.dll”文件拖動到此選項卡中,此時在工具箱中可以看到”MyToolsBox”選項卡中有一個組件”MyDataGridView”,從工具箱中拖動這個組件到Form1的窗體中,并適當調整大小與位置。

最后將其中Form1.cs的代碼改成如下內容并生成文件Demo.exe文件:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

namespace Demo

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

//智能生成列集 this.myDataGridView1.GenerateColumns();

//獲取演示數據 this.myDataGridView1.DataSource = Demo.Empolyee.GetDemoList();

this.myDataGridView1.ReadOnly = false;

}

}

}

開始執(zhí)行,可看到如下的畫面。從中可以看到Empolyee的7個公開屬性,只顯示了其中的六個,“籍貫”這個屬性由于其名稱中不包含用下劃線分隔的前綴,因此沒有在畫面中出現(xiàn):

四、小結

DataGridView是一個非常實用的顯示和編輯多行數據的控件,通過對它進行適當的擴展后,使它可以智能地根據數據源的基礎類型有選擇地自動生成列,如果想要對顯示的列集進行變動,只要修改邏輯層中對應的基礎類型的屬性即可,表現(xiàn)層不要作任何修改,大大地提高了工作效率,而且避免了出錯的可能,這完全符合代碼和表現(xiàn)分離的設計理念。

主站蜘蛛池模板: 国产精品第| 米奇精品一区二区三区| 国产精品七七在线播放| 国产精品手机视频一区二区| 伦伦影院精品一区| 天堂中文在线资源| 黄色网站在线观看无码| 91成人免费观看在线观看| 欧美一级特黄aaaaaa在线看片| 亚洲第一天堂无码专区| 成人韩免费网站| 国产精品xxx| 国产在线视频福利资源站| 潮喷在线无码白浆| 亚洲精品国产成人7777| 青草娱乐极品免费视频| 久久精品娱乐亚洲领先| 最新国语自产精品视频在| 日韩av手机在线| 欧美、日韩、国产综合一区| 国产色爱av资源综合区| 亚洲精品午夜天堂网页| 欧美精品二区| 国产国产人在线成免费视频狼人色| 午夜国产精品视频黄| 免费人成在线观看视频色| 无码国产伊人| 亚洲中文在线视频| 国产在线97| 伊人久久综在合线亚洲2019| 青青青国产免费线在| 无码国内精品人妻少妇蜜桃视频 | 精品伊人久久久大香线蕉欧美 | 国产成人在线小视频| 超清无码一区二区三区| 22sihu国产精品视频影视资讯| 国内精品久久久久久久久久影视| 一级毛片在线播放免费| 久久久成年黄色视频| 青青久视频| 国产日本欧美亚洲精品视| 亚洲精品无码AⅤ片青青在线观看| 亚洲天堂网在线观看视频| 99热国产这里只有精品无卡顿"| 农村乱人伦一区二区| 欧美人在线一区二区三区| a色毛片免费视频| 久久夜色撩人精品国产| 在线观看精品自拍视频| 国产又黄又硬又粗| 日本AⅤ精品一区二区三区日| 99精品热视频这里只有精品7| 亚洲欧美日韩色图| 一本一道波多野结衣一区二区 | 8090成人午夜精品| 亚洲AV无码乱码在线观看代蜜桃| 色网站在线视频| 久久亚洲国产视频| 國產尤物AV尤物在線觀看| 69免费在线视频| 欧美成人aⅴ| 暴力调教一区二区三区| 久久亚洲日本不卡一区二区| 天天综合色网| 九九香蕉视频| 精品无码日韩国产不卡av| 精品无码一区二区三区电影| 亚洲a级毛片| 国产成人无码综合亚洲日韩不卡| 四虎影视库国产精品一区| 亚洲色图另类| 欧美人与性动交a欧美精品| 国产成人a毛片在线| 18禁影院亚洲专区| 在线亚洲天堂| 成人在线观看不卡| 一级片一区| 欧美特黄一免在线观看| 秋霞一区二区三区| 免费一级毛片在线观看| 亚洲视频四区| 色婷婷啪啪|