在我之前的文章《Winform分頁控件支持表頭全選操作實現》中,有介紹過一種方法來實現DataGridView的表頭全選操作,不過這種方式,是通過綁定字段的方式實現,每次需要創建一個字段來專門做這個列頭綁定,顯得有點多余。那有沒有更好的方式呢,當然有,我這里介紹一種更好表頭全選實現的方式,然后說明我的分頁控件封裝后是如何簡單實現這種效果的。
1)傳統的DataGridView全選實現效果。
拋開我的分頁控件來講,實現傳統的DataGridView的表頭全選的方式,只需要引入一個類DatagridViewCheckBoxHeaderCell,它繼承自DataGridViewColumnHeaderCell,我們來看具體的使用代碼:
public FrmNormalGridViewSelect2() { InitializeComponent(); if (!this.DesignMode) { DataGridViewCheckBoxColumn colCB = new DataGridViewCheckBoxColumn(); DatagridViewCheckBoxHeaderCell cbHeader = new DatagridViewCheckBoxHeaderCell(); colCB.HeaderCell = cbHeader; this.dgvSelectAll.Columns.Add(colCB); cbHeader.OnCheckBoxClicked += new CheckBoxClickedHandler(cbHeader_OnCheckBoxClicked); } } void cbHeader_OnCheckBoxClicked(bool state) { foreach (DataGridViewRow Row in dgvSelectAll.Rows) { Row.Cells[0].Value = state; Row.Selected = state; } this.dgvSelectAll.RefreshEdit(); }
這樣額外的代碼操作即可實現表頭全選的操作了,實現效果如下所示
2)基於DevExpress的GridControl控件的全選實現。
做戲做全套,我們在開發中,也經常使用到基於DevExpress的系統界面開發,那么,不用創建字段的方式,在GridControl中有無好的實現方法呢。當然有,下面我來介紹一下。
首先引入一個GridCheckMarksSelection類,這個類就是用來實現這種全選效果的,我們看看其使用的代碼。
public FrmDevGridViwSelect2() { InitializeComponent(); this.gridView1.OptionsBehavior.Editable = true; this.gridView1.OptionsBehavior.ReadOnly = false; this.gridControl1.DataSourceChanged += new EventHandler(gridControl1_DataSourceChanged); } void gridControl1_DataSourceChanged(object sender, EventArgs e) { GridCheckMarksSelection selection = new GridCheckMarksSelection(gridView1); selection.CheckMarkColumn.VisibleIndex = 0; selection.CheckMarkColumn.Width = 60; }
是不是很簡單呢,它最終實現的效果會如下所示。
3)基於我的分頁控件的全選操作
有這么好的實現效果,我當然會把它集成到我的分頁控件里面了,當然,為了追求簡單就是美的方式,我會盡量簡化客戶的使用代碼。我們只需要設置一個屬性即可實現表頭全選的操作了(DevExpress版本和傳統版本代碼一樣)。
this.winGridViewPager1.ShowCheckBox = true;
我們來看看基於我的分頁控件實現的表頭全選功能,界面效果如何。
1)傳統界面的效果
2)DotNetBar界面效果
3)DevExpress界面效果
這樣的簡單調用就能實現表頭全選的操作,不需要另外其他額外的操作,是不是很好,簡潔呢?這其實就是我追求的表頭全選的最優方法了。
最后,可能讀者還有一個疑問,就是我全選或者部分選擇,我要知道我選擇的是那些行,該怎么操作呢?放心,我這個分頁控件也已經為你考慮了,呵呵。
通過調用下面的代碼即實現。
private void btnGetCheckedRows_Click(object sender, EventArgs e) { List<int> list = this.winGridViewPager1.GetCheckedRows(); StringBuilder sb = new StringBuilder(); int i = 1; foreach (int rowindex in list) { sb.Append(rowindex.ToString() + ","); if (i++ % 10 == 0) { sb.Append("\r\n"); } } MessageUtil.ShowTips(sb.ToString()); }
演示例子下載: