一个DataGridView辅助类
DataGridView是在用C#做windows界面程序時常用到的控件,DataGridView的功能非常多,用起來也非常復雜
例如
1. 我想在每行前面顯示行編號,則需要先設置RowHeadersVisible為true,然后,在添加RowPostPaint事件,而RowPostPaint寫起來也大同小異,這就非常沒有必要.
期望一個DataGridView中,只要設置某個屬性,這些都能自動做到
2. 為每一行添加一個checkbox是很多時候的基本要求,最好能在列的頭部也有一個checkbox,選擇它則所有行都被選中,取消它,則所有行都取消.而且,如果行選擇模式(SelectionMode)是CellSelect,則選中選擇框,行才可以被選擇,
如果行選擇模式(SelectionMode)是FullRowSelect,則選擇任何一列,選中框都會響應.
實現起來也比較復雜,需要手動添加一個DataGridViewCheckBoxColumn,并且重新設置DataGridViewColumnHeaderCell.為DataGridViewColumnHeaderCell添加事件
這個也最好設置一個屬性,這些功能能自動實現.
3. 設置一個DataGridView的顯示列也比較麻煩,需要在設置界面中選中Columns,然后編輯列,這樣太費勁,而且比較死板.這些顯示信息,與邏輯沒有任務關系,寫成代碼(即使是自動生成的),不是很合適.
借鑒做BS的經驗,最好這些信息寫成文本,可以減少代碼量,修改起來也容易.甚至我可以在程序運行的時候,改變顯示內容.
仔細思考一下,如果不是要求特別負責,則列只需要如下信息即可:
1) 列頭顯示文字
2) 列對應數據源中的屬性或DataTable中的列名
3) 列的固定寬度或占整體寬度的百分比(整體寬度應該為DataGridView寬度-所有列的固定寬度)
4) 有些列最好隱藏,例如無意義的唯一標識,所以還需要列是否顯示的相關信息
5) 列的對齊方式,靠左,靠右等.
這些信息可以使用JSON字符串配置.
- 實現目標:
1: DataGridView的顯示內容使用文本配置,不使用編碼,可以簡化編碼.
2: 為DatgaGridView提供多選框,并且通過頭部多選框可全選或全不選.
3: 為DataGridView提供行編號.
4: 設置為一個獨立的類,而不要繼承自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還沒有嘗試)
轉載于:https://www.cnblogs.com/Rong-/p/5412606.html
總結
以上是生活随笔為你收集整理的一个DataGridView辅助类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: appscan 历史版本下载
- 下一篇: winform Tab键循序 小发现