轉帖|使用教程|編輯:龔雪|2014-03-28 10:16:39.000|閱讀 7915 次
概述:本文介紹了如何使用DevExpress GridControl控件代替傳統的DataGridView實現表頭全選的動能,并提供具體實現方法的源碼下載。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
看到網上有人說WinForm默認GridView多選操作不是很方便,想在列表的左邊增加一列可以勾選,并且最好支持列表頭部全選的操作,否則數據多的時候一個個勾選太費事。
基于以上需求,經過一番篩選,我最終選擇了DevExpress GridControl來代替傳統DataGridView實現以上需求。實現過程中,除了基于傳統的DataGridView全選操作不能少,基于DevExpress控件的GridView全選操作也應該支持。
下面先上圖介紹兩種不同的效果,然后在詳細介紹代碼的實現。
1)DevExpress控件的GridView的實現多選操作
先講DevExpress控件的GridView的實現,要實現的功能基本上是處理單擊全選操作、重新繪制表頭等操作,首先在加載第一步實現相關的事件和操作,如下所示。
this.gridView1.Click += new System.EventHandler(this.gridView1_Click); this.gridView1.CustomDrawColumnHeader += new DevExpress.XtraGrid.Views.Grid.ColumnHeaderCustomDrawEventHandler(this.gridView1_CustomDrawColumnHeader); this.gridView1.DataSourceChanged += new EventHandler(gridView1_DataSourceChanged);
然后就是實現里面的事件操作了,對應的代碼如下所示。
private void gridView1_Click(object sender, EventArgs e) { if (DevControlHelper.ClickGridCheckBox(this.gridView1, "Check", m_checkStatus)) { m_checkStatus = !m_checkStatus; } } private void gridView1_CustomDrawColumnHeader(object sender, DevExpress.XtraGrid.Views.Grid.ColumnHeaderCustomDrawEventArgs e) { if (e.Column != null && e.Column.FieldName == "Check") { e.Info.InnerElements.Clear(); e.Painter.DrawObject(e.Info); DevControlHelper.DrawCheckBox(e, m_checkStatus); e.Handled = true; } } void gridView1_DataSourceChanged(object sender, EventArgs e) { GridColumn column = this.gridView1.Columns.ColumnByFieldName("Check"); if (column != null) { column.Width = 80; column.OptionsColumn.ShowCaption = false; column.ColumnEdit = new RepositoryItemCheckEdit(); } }
其中單擊和繪制表頭的操作,交給另外一個類DevControlHelper來獨立進行處理,數據源變化gridView1_DataSourceChanged實現的操作是尋找對應的全選列,并設置列寬、隱藏表頭標題,并設置為復選框樣式。
DevControlHelper 類的實現代碼如下所示:
public static void DrawCheckBox(DevExpress.XtraGrid.Views.Grid.ColumnHeaderCustomDrawEventArgs e, bool chk) { RepositoryItemCheckEdit repositoryCheck = e.Column.ColumnEdit as RepositoryItemCheckEdit; if (repositoryCheck != null) { Graphics g = e.Graphics; Rectangle r = e.Bounds; DevExpress.XtraEditors.ViewInfo.CheckEditViewInfo info; DevExpress.XtraEditors.Drawing.CheckEditPainter painter; DevExpress.XtraEditors.Drawing.ControlGraphicsInfoArgs args; info = repositoryCheck.CreateViewInfo() as DevExpress.XtraEditors.ViewInfo.CheckEditViewInfo; painter = repositoryCheck.CreatePainter() as DevExpress.XtraEditors.Drawing.CheckEditPainter; info.EditValue = chk; info.Bounds = r; info.CalcViewInfo(g); args = new DevExpress.XtraEditors.Drawing.ControlGraphicsInfoArgs(info, new DevExpress.Utils.Drawing.GraphicsCache(g), r); painter.Draw(args); args.Cache.Dispose(); } } public static bool ClickGridCheckBox(DevExpress.XtraGrid.Views.Grid.GridView gridView, string fieldName, bool currentStatus) { bool result = false; if (gridView != null) { gridView.ClearSorting();//禁止排序 gridView.PostEditor(); DevExpress.XtraGrid.Views.Grid.ViewInfo.GridHitInfo info; Point pt = gridView.GridControl.PointToClient(Control.MousePosition); info = gridView.CalcHitInfo(pt); if (info.InColumn && info.Column != null && info.Column.FieldName == fieldName) { for (int i = 0; i < gridView.RowCount; i++) { gridView.SetRowCellValue(i, fieldName, !currentStatus); } return true; } } return result; }
2)傳統DataGridView實現全選操作
首先在第一列增加一個CheckBox控件,然后通過相關的事件,調整其位置,并相應對應的單擊全選操作,初始化代碼如下所示。
CheckBox HeaderCheckBox = null; public FrmNormalGridViewSelect() { InitializeComponent(); if (!this.DesignMode) { HeaderCheckBox = new CheckBox(); HeaderCheckBox.Size = new Size(15, 15); this.dgvSelectAll.Controls.Add(HeaderCheckBox); HeaderCheckBox.KeyUp += new KeyEventHandler(HeaderCheckBox_KeyUp); HeaderCheckBox.MouseClick += new MouseEventHandler(HeaderCheckBox_MouseClick); dgvSelectAll.CurrentCellDirtyStateChanged += new EventHandler(dgvSelectAll_CurrentCellDirtyStateChanged); dgvSelectAll.CellPainting += new DataGridViewCellPaintingEventHandler(dgvSelectAll_CellPainting); } }
事件實現了CheckBox重繪調整,并處理單擊事件,如下所示。
private void HeaderCheckBox_MouseClick(object sender, MouseEventArgs e) { HeaderCheckBoxClick((CheckBox)sender); } private void dgvSelectAll_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) { if (e.RowIndex == -1 && e.ColumnIndex == 0) ResetHeaderCheckBoxLocation(e.ColumnIndex, e.RowIndex); } private void ResetHeaderCheckBoxLocation(int ColumnIndex, int RowIndex) { Rectangle oRectangle = this.dgvSelectAll.GetCellDisplayRectangle(ColumnIndex, RowIndex, true); Point oPoint = new Point(); oPoint.X = oRectangle.Location.X + (oRectangle.Width - HeaderCheckBox.Width) / 2 + 1; oPoint.Y = oRectangle.Location.Y + (oRectangle.Height - HeaderCheckBox.Height) / 2 + 1; HeaderCheckBox.Location = oPoint; } private void HeaderCheckBoxClick(CheckBox HCheckBox) { foreach (DataGridViewRow Row in dgvSelectAll.Rows) { ((DataGridViewCheckBoxCell)Row.Cells["chkBxSelect"]).Value = HCheckBox.Checked; } dgvSelectAll.RefreshEdit(); }
轉載自//www.cnblogs.com/wuhuacong/archive/2011/12/30/2307600.html
你可能感興趣的教程
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:慧都控件網