Winform传统DataGridView和DevExpress控件的GridControl两者表头全选功能的实现

简介:

在开发一个个人项目的时候,有客户反映默认GridView多选操作不是很方便和理想,想在列表的左边增加一列可以勾选,并且最好支持列表头部全选的操作,否则数据多的时候一个个勾选要到天荒地老。

基于以上需求,找了不少例子进行比较,并对代码进行测试改进,终于完成了以上的功能了, 并且由于我本身做了多套界面的处理,因此,基于传统的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( 1515);
                 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();
    }

 本文转自博客园伍华聪的博客,原文链接:Winform传统DataGridView和DevExpress控件的GridControl两者表头全选功能的实现,如需转载请自行联系原博主。



目录
相关文章
|
C# 索引 Windows
Winform控件优化之TabControl控件的使用和常用功能
TabControl是一个分页切换(tab)控件,不同的页框内可以呈现不同的内容,将主要介绍调整tab的左右侧显示、设置多行tab、禁用或删除tabpage、隐藏TabControl头部的选项卡等
3735 0
Winform控件优化之TabControl控件的使用和常用功能
|
1天前
如何实现右击DataGridView的表格出现快捷菜单进行操作
如何实现右击DataGridView的表格出现快捷菜单进行操作
8 0
|
7月前
|
数据安全/隐私保护
DevExpress-GridControl控件-GridView使用
DevExpress-GridControl控件-GridView使用
WPF 获取列表中控件的同时,选中其所在行
WPF 获取列表中控件的同时,选中其所在行
|
数据处理 数据库
DevExpress gridview下拉框repositoryItemComboBox的使用
原文  http://www.cnblogs.com/huangzhenhua/p/3898534.html 本以为DevExpress gridview中的下拉框会像比原来的datatgridview中的下拉框绑定数据简单好用,没想到费了老大劲,查阅各种资料总算是绑定上了数据,并且能够实现想要的效果。下面就详细写一下这个实现的过程,分享一下,同时也是对这个知识再次熟悉一
2146 0
|
C#
获取wpf datagrid当前被编辑单元格的内容
原文 获取wpf datagrid当前被编辑单元格的内容 确认修改单元个的值, 使用到datagrid的两个事件 开始编辑事件 BeginningEdit="dataGrid_BeginningEdit" 编辑结束事件 CellEditEnding="dataGrid_CellEditE...
2296 0
|
C#
WPF 自带Datagrid编辑后无法更新数据源的问题
原文  WPF 自带Datagrid编辑后无法更新数据源的问题 解决办法: 在列的绑定属性里加上UpdateSourceTrigger,示例XAML如下                                                                 这样当即时编辑Datagrid单元格数据时会立马更新数据源的值。
1485 0
|
C# 前端开发
wpf中的datagrid绑定操作按钮是否显示或者隐藏
如图,需要在wpf中的datagrid的操作那列有个确认按钮,然后在某些条件下确认按钮可见,某些情况下不可见的,放在mvc里直接在cshtml页面中if..else就行了。 但是在wpf里不行。。网上搜索了好久才找到解决方法,原来只是binding那个visiable属性就行了,
6845 0
|
C#
C# DataGridview控件自动下拉到最后一行
有时候使用DataGridView难免会在最后插入一条数据,如果插入的数据超过滚动条显示的行数,那么默认情况下不会显示到最后一行。增加以下代码一直将滚动条拉倒最低。 this.dataGridView1.
2352 0