DataGridView是在用C#做windows界面程式時常用到的控制項,DataGridView的功能非常多,用起來也非常複雜,下麵我就為DataGridView提供一個擴展. 實現目標: 1: DataGridView的顯示內容使用文本配置,不使用編碼,可以簡化編碼.2: 為DatgaGridV ...
DataGridView是在用C#做windows界面程式時常用到的控制項,DataGridView的功能非常多,用起來也非常複雜,下麵我就為DataGridView提供一個擴展.
- 實現目標:
1: DataGridView的顯示內容使用文本配置,不使用編碼,可以簡化編碼.
2: 為DatgaGridView提供多選框,並且通過頭部多選框可全選或全不選.
3: 為DataGridView提供行編號.
雖然2,3在很多文章中都有人介紹如何實現,但是這些實現都太麻煩,我希望能做到使用者只設置一兩個屬性,這些能力DataGridView就可以自動擁有,而不需要添加事先,委托什麼的.
還有,就是不希望實現這些功能的類繼承自DataGridView,換句話說,不管用不用這個實現類,使用者的界面最好都可以運行.
- 介面
下麵是我實現該類的主要介面:
1 public sealed class DGViewHelper 2 { 3 /// <summary> 4 /// 初始化控制項 5 /// </summary> 6 /// <param name="form"></param> 7 /// <param name="dgv"></param> 8 /// <param name="json"></param> 9 /// <param name="usingCheck">是否使用覆選列</param> 10 /// <param name="usingNo">是否使用編號</param> 11 /// <returns></returns> 12 public bool Init(ContainerControl form, DataGridView dgv, string json, bool usingCheck = false, bool usingNo = false); 13 }
- 演示代碼
下麵是該類的演示代碼:
1 public partial class ProcessMaterial : UserControl 2 { 3 DGViewHelper dgvHelper = new DGViewHelper(); 4 5 private void ProcessMaterial_Load(object sender, EventArgs e) 6 { 7 dgvHelper.Init(this, dgvMaterial, ViewConfig.ViewDefault.ProcessMaterial_DGV, true, true); 8 9 // ... 10 11 DataTable dtMaterial = GetMaterials(type); 12 dgvMaterial.DataSource = dt; 13 } 14 15 string columnsInfo = " 16 [ 17 { 18 ""ColumnID"":""Name"", 19 ""ColumnText"":""名稱"", 20 ""ColumnName"":""Name"", 21 ""WidthPercent"":30, 22 ""Align"":""left"", 23 ""IsShow"":1 24 }, 25 { 26 ""ColumnID"":""Model"", 27 ""ColumnText"":""型號"", 28 ""ColumnName"":""Model"", 29 ""WidthPercent"":30, 30 ""Align"":""left"", 31 ""IsShow"":1 32 }, 33 { 34 ""ColumnID"":""Count"", 35 ""ColumnText"":""數量"", 36 ""ColumnName"":""Count"", 37 ""WidthPercent"":10, 38 ""Align"":""left"", 39 ""IsShow"":1 40 }, 41 { 42 ""ColumnID"":""Other"", 43 ""ColumnText"":""操作"", 44 ""ColumnName"":"""", 45 ""WidthPercent"":30, 46 ""Align"":""left"", 47 ""IsShow"":1 48 }, 49 { 50 ""ColumnID"":""ProductID"", 51 ""ColumnText"":"""", 52 ""ColumnName"":""ProductID"", 53 ""WidthPercent"":0, 54 ""Align"":""center"", 55 ""IsShow"":0 56 }, 57 { 58 ""ColumnID"":""ProcessId"", 59 ""ColumnText"":"""", 60 ""ColumnName"":""ProcessId"", 61 ""WidthPercent"":0, 62 ""Align"":""center"", 63 ""IsShow"":0 64 }, 65 { 66 ""ColumnID"":""MaterialID"", 67 ""ColumnText"":"""", 68 ""ColumnName"":""MaterialID"", 69 ""WidthPercent"":0, 70 ""Align"":""center"", 71 ""IsShow"":0 72 } 73 ]"; 74 }
columnsInfo字元串需要解釋一下,該字元串為一個JSON字元串,表示一個數組.數組中存儲這DataBGridView要顯示的列信息,包括:
ColumnID:列的唯一標識
ColumnText:列表頭顯示文字
ColumnName:列數據在DataSource對應的列或這屬性
WidthPercent: 列占整個DataGridView寬度的百分比
Align:列對齊方式,left,right,center三種
IsShow:是否顯示1實現,0隱藏
- 演示界面
演示界面截圖:
- 相關代碼
類源代碼下載:
http://files.cnblogs.com/files/Rong-/DGViewHelper.zip
完整程式路徑:
http://git.oschina.net/xumingxsh/HiCSClient
- 遺留問題
1:DataGridView的列有很多的細節內容,在DGViewHelper中我只是對主要的內容進行了抽象,而且個人覺得80%的場景下,也不一定需要關註其他的列的細節內容.但是對列的抽象畢竟不完整,以後很可能會添加更多的列信息,例如當前採用百分比的列寬,以後可能會添加固定的列寬
2: 在DGViewHelper.cs中,DGVColumnInfo應該為一個外界不可見的DGViewHelper的內部類,但是由於無法進行JSON字元串轉換,所以只能聲明為public(internal還沒有嘗試)