DataGridView控件用法(二):为每行记录最后加“编辑”-“删除”按钮列

1. 在DataGridView控件用法(一)中已经显示出列表数据,这时我们需要对每行数据记录进行编辑,需要添加“编辑”、“删除”、“查看”这样的超链接。代码如下:

1//为每行数据增加编辑列。
2//设定列不能自动作成
3UserdataGridView.AutoGenerateColumns = false;
4//创建一个DataGridViewLinkColumn列
5DataGridViewLinkColumn dlink = new DataGridViewLinkColumn();
6dlink.Text = "编辑";//添加的这列的显示文字,即每行最后一列显示的文字。
7dlink.Name = "linkEdit";
8dlink.HeaderText = "编辑";//列的标题
9dlink.UseColumnTextForLinkValue = true;//上面设置的dlink.Text文字在列中显示
10UserdataGridView.Columns.Add(dlink);//将创建的列添加到UserdataGridView中
11
12//同上方法为每条记录创建“删除”超链接
13DataGridViewLinkColumn dlink2 = new DataGridViewLinkColumn();
14dlink2.Text = "删除";
15dlink2.Name = "linkDelete";
16dlink2.HeaderText = "删除";
17dlink2.UseColumnTextForLinkValue = true;
18UserdataGridView.Columns.Add(dlink2);
19
20//同上方法为每条记录创建“查看”超链接
21DataGridViewLinkColumn dlink3 = new DataGridViewLinkColumn();
22dlink3.Text = "查看";
23dlink3.Name = "linkView";
24dlink3.HeaderText = "查看";
25dlink3.UseColumnTextForLinkValue = true;
26UserdataGridView.Columns.Add(dlink3);

执行效果如下:

PS:上述是自己编写代码实现这些按钮,你也可以在设计器中利用属性栏来添加(通过直接点击DataGridView的编辑列,点击“添加”,选择“未绑定列”,选择类型为“DataGridViewButtonColumn”)。

同理:单元格显示按钮(DataGridViewButtonColumn),添加下拉框(DataGridViewComboBoxColumn),显示选择框(DataGridViewCheckBoxColumn) 方法也是这样。实际上DataGridViewColumn有六种派生类: DataGridViewButtonColumn,DataGridViewCheckBoxColumn,DataGridViewComboBoxColumn,DataGridViewImageColumn

DataGridViewLinkColumn 和DataGridViewTextBoxColumn,你可以根据自己不同需要选择不同列的类型,用法一样,只是类不同而已。

DataGridViewButtonColumn用法如下:

1//设定列不能自动作成
2UserdataGridView.AutoGenerateColumns = false;
3//创建一个DataGridViewButtonColumn按钮列
4DataGridViewButtonColumn dbtEdit = new DataGridViewButtonColumn();
5dbtEdit.Text = "编辑";//添加的这列的显示文字,即每行最后一列显示的文字。
6dbtEdit.Name = "buttonEdit";
7dbtEdit.HeaderText = "编辑";//列的标题
8dbtEdit.UseColumnTextForButtonValue = true;//上面设置的dlink.Text文字在列中显示
9dbtEdit.Width = 66;
10UserdataGridView.Columns.Add(dbtEdit);//将创建的列添加到UserdataGridView中
11
12//创建“删除”按钮
13DataGridViewButtonColumn dbtDelete = new DataGridViewButtonColumn();
14dbtDelete.Text = "删除";
15dbtDelete.Name = "buttonDelete";
16dbtDelete.HeaderText = "删除";
17dbtDelete.UseColumnTextForButtonValue = true;
18dbtDelete.Width = 66;
19UserdataGridView.Columns.Add(dbtDelete);
20
21//创建“查看”按钮
22DataGridViewButtonColumn dbtView = new DataGridViewButtonColumn();
23dbtView.Text = "查看";
24dbtView.Name = "buttonView";
25dbtView.HeaderText = "查看";
26dbtView.UseColumnTextForButtonValue = true;
27dbtView.Width = 66;
28UserdataGridView.Columns.Add(dbtView);

效果如下:

单元格添加下拉框,DataGridViewComboBoxColumn用法如下:

1DataGridViewComboBoxColumn dCombo = new DataGridViewComboBoxColumn();
2dCombo.Items.Add("管理员");
3dCombo.Items.Add("会员");
4dCombo.Items.Add("用户");
5dCombo.Name = "dCombo";
6//该列显示的位置
7//dcombo.DisplayIndex = 1;
8dCombo.HeaderText = "角色";
9
10//绑定数据库的值时使用以下属性
11//dCombo.DataSource = ds1 //ds1为从要显示的数据库表中查出来的数据集,如DatsSet等。
12//dCombo.DataPropertyName = "USER_ID";//绑定的列
13
14UserdataGridView.Columns.Add(dCombo); 

效果如下:

注意:上图左边的下拉框无法展开下面的数据,因为dataGridView的下拉框是在编辑表格可以编辑状态时才能拉出下面的选项,也就是说需要在dataGridView的ReadOnly属性为false的情况下,才可点击展开下面的数据,如上右图。

上述代码创建了一个下拉列表,默认显示的下拉框,选择时需要点击三次,第一次选中单元格,第二次启用编辑,第三次打开下拉框。如果需要一次点击打开下拉框,可以启用DataGridView的CellEnter()事件,代码如下:

1private void UserdataGridView_CellEnter(object sender, DataGridViewCellEventArgs e)
2{
3//实现单击一次显示下拉列表框
4if (UserdataGridView.Columns[e.ColumnIndex] is DataGridViewComboBoxColumn && e.RowIndex != -1)
5{
6SendKeys.Send("{F4}");
7}
8}

PS:还可以将下拉框动态绑定数据库。通过dCombo.DataSource和dcombo.DataPropertyNam来设置该下拉框数据来自的数据源,和绑定的列,具体用法略。

单元格添加复选框和图片控件,DataGridViewCheckBoxColumnDataGridViewImageColumn用法如下:

1//DataGridView显示复选框
2DataGridViewCheckBoxColumn checkBox = new DataGridViewCheckBoxColumn();
3checkBox.HeaderText = "选择框";
4checkBox.Name = "checkbox";
5checkBox.AutoSizeMode =
6DataGridViewAutoSizeColumnMode.DisplayedCells;
7checkBox.FlatStyle = FlatStyle.Standard;
8//显示选择框的三种状态
9checkBox.ThreeState = true;
10UserdataGridView.Columns.Add(checkBox);
11
12//DataGridView显示图像
13DataGridViewImageColumn dgvI = new DataGridViewImageColumn();
14dgvI.Name = "Image";
15dgvI.ValuesAreIcons = false;
16dgvI.Image = new Bitmap("F://ashin.jpg");
17dgvI.ImageLayout = DataGridViewImageCellLayout.Zoom;
18dgvI.Description = "测试的图片";
19UserdataGridView.Columns.Add(dgvI);

效果如下:

2. 按钮触发的事件。添加了这些按钮是为了点击跳到不同的程序段执行不同的功能,拦截鼠标点击触发的事件函数如下:

3. DataGridView中合并列。上述我们添加的3个按钮在3个列中,而我们希望这3个列能有一个共同的表头可以叫做“编辑”或“操作”。但在WinForm中我们常用的DataGridView控件,不支持在一列中显示多个按钮。怎么办?网上对DataGridView控件的列或行的合并有很多博文,大致思想有2种,一种是设法让其一列可以显示多个按钮,另一种是每列显示一个按钮(如本文上面的做法),然后将这3列合并,合并的时候是利用DataGridView的CellPainting事件对表头进行重绘,网友们说该方法存在页面往下拉动时表格绘制偏差或绘制延迟不刷新等问题,似乎后面这种方法用的多些。总之无论哪种方法实现起来都貌似比较繁琐,时间有限,我只是练练手(本身就是新手),弄个小程序而已,不想花太多时间研究这个小细节,等以后有空,再回来仔细研究研究。下面给个合并列的例子,有个朋友是这样实现二维表头的,代码如下:

1int top = 0;
2int left = 0;
3int height = 0;
4int width1 = 0;
5private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
6{
7#region 重绘datagridview表头
8DataGridView dgv = (DataGridView)(sender);
9if (e.RowIndex == -1 && (e.ColumnIndex == 3 || e.ColumnIndex == 4))
10{
11//e.CellStyle.Font = new Font(dataGridView1.DefaultCellStyle.Font, FontStyle.Bold);
12//e.CellStyle.WrapMode = DataGridViewTriState.True;
13if (e.ColumnIndex == 3)
14{
15top = e.CellBounds.Top;
16left = e.CellBounds.Left;
17height = e.CellBounds.Height;
18width1 = e.CellBounds.Width;
19}
20
21int width2 = this.dataGridView1.Columns[4].Width;
22
23Rectangle rect = new Rectangle(left, top, width1 + width2, e.CellBounds.Height);
24using (Brush backColorBrush = new SolidBrush(e.CellStyle.BackColor))
25{
26//抹去原来的cell背景
27e.Graphics.FillRectangle(backColorBrush, rect);
28}
29
30using (Pen gridLinePen = new Pen(dgv.GridColor))
31{
32e.Graphics.DrawLine(gridLinePen, left, top, left + width1 + width2, top);
33e.Graphics.DrawLine(gridLinePen, left, top + height / 2, left + width1 + width2, top + height / 2);
34e.Graphics.DrawLine(gridLinePen, left + width1, top + height / 2, left + width1, top + height);
35
36//计算绘制字符串的位置
37string columnValue = Year;
38SizeF sf = e.Graphics.MeasureString(columnValue, e.CellStyle.Font);
39float lstr = (width1 + width2 - sf.Width) / 2;
40float rstr = (height / 2 - sf.Height) / 2;
41//画出文本框
42if (columnValue != "")
43{
44e.Graphics.DrawString(columnValue, e.CellStyle.Font, new SolidBrush(e.CellStyle.ForeColor),
45left + lstr,
46top + rstr,
47StringFormat.GenericDefault);
48}
49
50//计算绘制字符串的位置
51columnValue = "局网台资产额";
52sf = e.Graphics.MeasureString(columnValue, e.CellStyle.Font);
53lstr = (width1 - sf.Width) / 2;
54rstr = (height / 2 - sf.Height) / 2;
55//画出文本框
56if (columnValue != "")
57{
58e.Graphics.DrawString(columnValue, e.CellStyle.Font, new SolidBrush(e.CellStyle.ForeColor),
59left + lstr,
60top + height / 2 + rstr,
61StringFormat.GenericDefault);
62}
63
64//计算绘制字符串的位置
65columnValue = "网络资产额";
66sf = e.Graphics.MeasureString(columnValue, e.CellStyle.Font);
67lstr = (width2 - sf.Width) / 2;
68rstr = (height / 2 - sf.Height) / 2;
69//画出文本框
70if (columnValue != "")
71{
72e.Graphics.DrawString(columnValue, e.CellStyle.Font, new SolidBrush(e.CellStyle.ForeColor),
73left + width1 + lstr,
74top + height / 2 + rstr,
75StringFormat.GenericDefault);
76}
77}
78e.Handled = true;
79}
80#endregion
81}

不过:虽然没有仔细研究列的合并,我暂时还是找了个方法一定程度上替代了合并问题。因为我需要的是合并“删除”、“编辑”和“查看”这三列,本想就不显示表头好了,反正是操作列,不显示表头不注意也看不出什么来。巧合,我发现爱英思躺一个月以前发布了一篇博客专门介绍EasyCode生成器生成的修改、删除信息列表界面,用的是EasyCode 2.0版本,生成的页面第一感觉就是非常清新,真是眼前一亮,原来EasyCode代码生成器这么强大!!更诱人的是正有我想要的类似的合并列的功能,为什么说类似呢,因为样子是一样,但他是将1列(一个单元格)里面放置2个按钮,而不是常见的那种一列放一个按钮然后合并单元格的表头。下面就是爱英思躺团队用EasyCode 2.0.50727.4963版本生成的WinForm中DataGridView控件的自定义按钮列的外观,请看:

EasyCode 2.0生成的winform按钮列

关于如何设计WinForm中DataGridView控件的自定义按钮列,详细可参考该博客:

http://www.cnblogs.com/BudEasyCode/archive/2012/02/29/2373702.html

EasyCode的官方网站:http://www.budeasycode.com

我并没有用生成的所有代码,而是只拿出了其中的DataGridViewActionButtonColumn.cs类当控件来用的(该类是作者们继承DataGridViewColumn类,自己定制的一个控件而已!正如我们前面提到的DataGridViewColumn有六种派生类: DataGridViewButtonColumn,DataGridViewCheckBoxColumn…一样!) 我的用法,详见下一篇:DataGridView控件用法(三)。


来源:Blog of JJoy

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值