通过绘制在datagridview控件列头添加一个checkbox控件
2009-03-06 10:11
441 查看
众所周知,datagridview控件是CS架构中用的比较频繁的一个控件,里面提供了checkbox列的功能,可是却没有在列头给出checkbox控件用于全选/全部取消所有行的功能,确实是个遗憾,这里就通过绘制实现这个功能.
该程序参考codeproject上的程序,网址如下:
http://www.codeproject.com/KB/grid/CheckBoxHeaderCell.aspx 向其致敬!
一.创建一个表,里面包含bit字段,datagridview的DataGridViewCheckBoxColumn列会自动将其转换成checkbox列
见表语句如下,数据库名为testDB
CREATE TABLE [dbo].[UserInfo] (
[RID] [varchar] (32) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[username] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[gendar] [bit] NULL
) ON [PRIMARY]
二.主要代码
datagridviewCheckboxHeaderEventArgs类,用在在checkbox单击事件中提供类头checkbox的选择状态
Code
1 //定义包含列头checkbox选择状态的参数类
2 class datagridviewCheckboxHeaderEventArgs : EventArgs
3 {
4 private bool checkedState = false;
5
6 public bool CheckedState
7 {
8 get { return checkedState; }
9 set { checkedState = value; }
10 }
11 }
datagridviewCheckboxHeaderCell类,这是个关键列,用于绘制列头checkbox和创建鼠标单击事件
Code
1 //定义继承于DataGridViewColumnHeaderCell的类,用于绘制checkbox,定义checkbox鼠标单击事件
2 class datagridviewCheckboxHeaderCell : DataGridViewColumnHeaderCell
3 {
4 Point checkBoxLocation;
5 Size checkBoxSize;
6 bool _checked = false;
7 Point _cellLocation = new Point();
8 System.Windows.Forms.VisualStyles.CheckBoxState _cbState =
9 System.Windows.Forms.VisualStyles.CheckBoxState.UncheckedNormal;
10 public event datagridviewcheckboxHeaderEventHander OnCheckBoxClicked;
11
12
13 //绘制列头checkbox
14 protected override void Paint(System.Drawing.Graphics graphics,
15 System.Drawing.Rectangle clipBounds,
16 System.Drawing.Rectangle cellBounds,
17 int rowIndex,
18 DataGridViewElementStates dataGridViewElementState,
19 object value,
20 object formattedValue,
21 string errorText,
22 DataGridViewCellStyle cellStyle,
23 DataGridViewAdvancedBorderStyle advancedBorderStyle,
24 DataGridViewPaintParts paintParts)
25 {
26 base.Paint(graphics, clipBounds, cellBounds, rowIndex,
27 dataGridViewElementState, value,
28 formattedValue, errorText, cellStyle,
29 advancedBorderStyle, paintParts);
30 Point p = new Point();
31 Size s = CheckBoxRenderer.GetGlyphSize(graphics,
32 System.Windows.Forms.VisualStyles.CheckBoxState.UncheckedNormal);
33 p.X = cellBounds.Location.X +
34 (cellBounds.Width / 2) - (s.Width / 2) - 1;//列头checkbox的X坐标
35 p.Y = cellBounds.Location.Y +
36 (cellBounds.Height / 2) - (s.Height / 2);//列头checkbox的Y坐标
37 _cellLocation = cellBounds.Location;
38 checkBoxLocation = p;
39 checkBoxSize = s;
40 if (_checked)
41 _cbState = System.Windows.Forms.VisualStyles.
42 CheckBoxState.CheckedNormal;
43 else
44 _cbState = System.Windows.Forms.VisualStyles.
45 CheckBoxState.UncheckedNormal;
46 CheckBoxRenderer.DrawCheckBox
47 (graphics, checkBoxLocation, _cbState);
48 }
49
50
51
52 /// <summary>
53 /// 点击列头checkbox单击事件
54 /// </summary>
55 protected override void OnMouseClick(DataGridViewCellMouseEventArgs e)
56 {
57
58 Point p = new Point(e.X + _cellLocation.X, e.Y + _cellLocation.Y);
59 if (p.X >= checkBoxLocation.X && p.X <=
60 checkBoxLocation.X + checkBoxSize.Width
61 && p.Y >= checkBoxLocation.Y && p.Y <=
62 checkBoxLocation.Y + checkBoxSize.Height)
63 {
64 _checked = !_checked;
65
66
67 //获取列头checkbox的选择状态
68 datagridviewCheckboxHeaderEventArgs ex = new datagridviewCheckboxHeaderEventArgs();
69 ex.CheckedState = _checked;
70
71 object sender = new object();//此处不代表选择的列头checkbox,只是作为参数传递。应该列头checkbox是绘制出来的,无法获得它的实例
72
73 if (OnCheckBoxClicked != null)
74 {
75 OnCheckBoxClicked(sender, ex);//触发单击事件
76 this.DataGridView.InvalidateCell(this);
77 }
78
79 }
80 base.OnMouseClick(e);
81 }
82
83 }
还要定义和事件相关的委托:
//定义触发单击事件的委托
public delegate void datagridviewcheckboxHeaderEventHander(object sender, datagridviewCheckboxHeaderEventArgs e);
另外是界面操作代码:
Code
1 /// <summary>
2 /// 加载数据
3 /// </summary>
4 private void btnLoadData_Click(object sender, EventArgs e)
5 {
6 DataTable dtTemp = new DataTable();
7
8 using (SqlConnection con = new SqlConnection("server=.;uid=sa;pwd=sa;database=testdb;"))
9 {
10 SqlDataAdapter sa = new SqlDataAdapter("select * from userinfo", con);
11 sa.Fill(dtTemp);
12 }
13
14 this.dataGridView1.DataSource = dtTemp;
15 }
16
17
18 /// <summary>
19 /// 在checkbox列显示列头checkbox
20 /// </summary>
21 /// <param name="sender"></param>
22 /// <param name="e"></param>
23 private void button1_Click(object sender, EventArgs e)
24 {
25
26 datagridviewCheckboxHeaderCell ch = new datagridviewCheckboxHeaderCell();
27 ch.OnCheckBoxClicked += new datagridviewcheckboxHeaderEventHander(ch_OnCheckBoxClicked);//关联单击事件
28
29
30 //第三列为DataGridViewCheckBoxColumn
31 DataGridViewCheckBoxColumn checkboxCol = this.dataGridView1.Columns[2] as DataGridViewCheckBoxColumn;
32 checkboxCol.HeaderCell = ch;
33 checkboxCol.HeaderCell.Value = string.Empty;//消除列头checkbox旁出现的文字
34 }
35
36 /// <summary>
37 /// 单击事件
38 /// </summary>
39 private void ch_OnCheckBoxClicked(object sender, datagridviewCheckboxHeaderEventArgs e)
40 {
41 foreach (DataGridViewRow dgvRow in this.dataGridView1.Rows)
42 {
43 if (e.CheckedState)
44 {
45 dgvRow.Cells[2].Value = true;
46 }
47 else
48 {
49 dgvRow.Cells[2].Value = false;
50 }
51 }
52 }
该程序参考codeproject上的程序,网址如下:
http://www.codeproject.com/KB/grid/CheckBoxHeaderCell.aspx 向其致敬!
一.创建一个表,里面包含bit字段,datagridview的DataGridViewCheckBoxColumn列会自动将其转换成checkbox列
见表语句如下,数据库名为testDB
CREATE TABLE [dbo].[UserInfo] (
[RID] [varchar] (32) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[username] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
[gendar] [bit] NULL
) ON [PRIMARY]
二.主要代码
datagridviewCheckboxHeaderEventArgs类,用在在checkbox单击事件中提供类头checkbox的选择状态
Code
1 //定义包含列头checkbox选择状态的参数类
2 class datagridviewCheckboxHeaderEventArgs : EventArgs
3 {
4 private bool checkedState = false;
5
6 public bool CheckedState
7 {
8 get { return checkedState; }
9 set { checkedState = value; }
10 }
11 }
datagridviewCheckboxHeaderCell类,这是个关键列,用于绘制列头checkbox和创建鼠标单击事件
Code
1 //定义继承于DataGridViewColumnHeaderCell的类,用于绘制checkbox,定义checkbox鼠标单击事件
2 class datagridviewCheckboxHeaderCell : DataGridViewColumnHeaderCell
3 {
4 Point checkBoxLocation;
5 Size checkBoxSize;
6 bool _checked = false;
7 Point _cellLocation = new Point();
8 System.Windows.Forms.VisualStyles.CheckBoxState _cbState =
9 System.Windows.Forms.VisualStyles.CheckBoxState.UncheckedNormal;
10 public event datagridviewcheckboxHeaderEventHander OnCheckBoxClicked;
11
12
13 //绘制列头checkbox
14 protected override void Paint(System.Drawing.Graphics graphics,
15 System.Drawing.Rectangle clipBounds,
16 System.Drawing.Rectangle cellBounds,
17 int rowIndex,
18 DataGridViewElementStates dataGridViewElementState,
19 object value,
20 object formattedValue,
21 string errorText,
22 DataGridViewCellStyle cellStyle,
23 DataGridViewAdvancedBorderStyle advancedBorderStyle,
24 DataGridViewPaintParts paintParts)
25 {
26 base.Paint(graphics, clipBounds, cellBounds, rowIndex,
27 dataGridViewElementState, value,
28 formattedValue, errorText, cellStyle,
29 advancedBorderStyle, paintParts);
30 Point p = new Point();
31 Size s = CheckBoxRenderer.GetGlyphSize(graphics,
32 System.Windows.Forms.VisualStyles.CheckBoxState.UncheckedNormal);
33 p.X = cellBounds.Location.X +
34 (cellBounds.Width / 2) - (s.Width / 2) - 1;//列头checkbox的X坐标
35 p.Y = cellBounds.Location.Y +
36 (cellBounds.Height / 2) - (s.Height / 2);//列头checkbox的Y坐标
37 _cellLocation = cellBounds.Location;
38 checkBoxLocation = p;
39 checkBoxSize = s;
40 if (_checked)
41 _cbState = System.Windows.Forms.VisualStyles.
42 CheckBoxState.CheckedNormal;
43 else
44 _cbState = System.Windows.Forms.VisualStyles.
45 CheckBoxState.UncheckedNormal;
46 CheckBoxRenderer.DrawCheckBox
47 (graphics, checkBoxLocation, _cbState);
48 }
49
50
51
52 /// <summary>
53 /// 点击列头checkbox单击事件
54 /// </summary>
55 protected override void OnMouseClick(DataGridViewCellMouseEventArgs e)
56 {
57
58 Point p = new Point(e.X + _cellLocation.X, e.Y + _cellLocation.Y);
59 if (p.X >= checkBoxLocation.X && p.X <=
60 checkBoxLocation.X + checkBoxSize.Width
61 && p.Y >= checkBoxLocation.Y && p.Y <=
62 checkBoxLocation.Y + checkBoxSize.Height)
63 {
64 _checked = !_checked;
65
66
67 //获取列头checkbox的选择状态
68 datagridviewCheckboxHeaderEventArgs ex = new datagridviewCheckboxHeaderEventArgs();
69 ex.CheckedState = _checked;
70
71 object sender = new object();//此处不代表选择的列头checkbox,只是作为参数传递。应该列头checkbox是绘制出来的,无法获得它的实例
72
73 if (OnCheckBoxClicked != null)
74 {
75 OnCheckBoxClicked(sender, ex);//触发单击事件
76 this.DataGridView.InvalidateCell(this);
77 }
78
79 }
80 base.OnMouseClick(e);
81 }
82
83 }
还要定义和事件相关的委托:
//定义触发单击事件的委托
public delegate void datagridviewcheckboxHeaderEventHander(object sender, datagridviewCheckboxHeaderEventArgs e);
另外是界面操作代码:
Code
1 /// <summary>
2 /// 加载数据
3 /// </summary>
4 private void btnLoadData_Click(object sender, EventArgs e)
5 {
6 DataTable dtTemp = new DataTable();
7
8 using (SqlConnection con = new SqlConnection("server=.;uid=sa;pwd=sa;database=testdb;"))
9 {
10 SqlDataAdapter sa = new SqlDataAdapter("select * from userinfo", con);
11 sa.Fill(dtTemp);
12 }
13
14 this.dataGridView1.DataSource = dtTemp;
15 }
16
17
18 /// <summary>
19 /// 在checkbox列显示列头checkbox
20 /// </summary>
21 /// <param name="sender"></param>
22 /// <param name="e"></param>
23 private void button1_Click(object sender, EventArgs e)
24 {
25
26 datagridviewCheckboxHeaderCell ch = new datagridviewCheckboxHeaderCell();
27 ch.OnCheckBoxClicked += new datagridviewcheckboxHeaderEventHander(ch_OnCheckBoxClicked);//关联单击事件
28
29
30 //第三列为DataGridViewCheckBoxColumn
31 DataGridViewCheckBoxColumn checkboxCol = this.dataGridView1.Columns[2] as DataGridViewCheckBoxColumn;
32 checkboxCol.HeaderCell = ch;
33 checkboxCol.HeaderCell.Value = string.Empty;//消除列头checkbox旁出现的文字
34 }
35
36 /// <summary>
37 /// 单击事件
38 /// </summary>
39 private void ch_OnCheckBoxClicked(object sender, datagridviewCheckboxHeaderEventArgs e)
40 {
41 foreach (DataGridViewRow dgvRow in this.dataGridView1.Rows)
42 {
43 if (e.CheckedState)
44 {
45 dgvRow.Cells[2].Value = true;
46 }
47 else
48 {
49 dgvRow.Cells[2].Value = false;
50 }
51 }
52 }
相关文章推荐
- 通过绘制在datagridview控件列头添加一个checkbox控件
- 通过绘制在datagridview控件列头添加一个checkbox控件
- 给 winform datagridview 头部 添加 checkbox 全选控件
- 为jEasyUi的日期控件添加一个“清空”按钮----通过修改1.4的easyui.min.js
- FineUI中在一个页面中通过控件事件(JS)向父页面中添加Tab页
- DataGridView中添加CheckBox控件主…
- Kendo Web UI Grid添加一个html控件如(checkbox,button)
- 在网页上添加一个CheckBox控件和一个RadioButton控件,实现CheckBox控件与RadioButton控件中的项目互选,即选中CheckBox中的一项相应的RadioButton中对应的项也选中,反之依然,条件是CheckBox控件不能多选
- 在C/S架构中,给DataGridView的表头添加CheckBox控件
- DataGridView添加另外一个控件。
- DataGridView中添加CheckBox控件主要采用两种方法
- 创建两个 DataTable 对象和一个 DataRelation 对象,并将这些新对象添加到 DataSet 中。这些表随后会显示在 DataGridView 控件中
- Flex中如何通过prompt属性在ComboBox控件中添加一个提示项(prompt)的例子
- winform 中 给DataGridView的表头添加CheckBox
- 怎么给Datagridview里面的控件添加事件
- 演示事件(Event)怎样使用以及怎样为用户控件添加一个事件(示例代码下载)
- android selector 简介(通过判断控件的不同状态为其添加背景等操作)
- 在gridview控件添加checkbox
- datagridview控件里添加进度条(自画)
- VB.NET逐行(一行一行)向DataGridView数据控件中添加数据