动态修改DataGridView单元格的类型和编辑单元格
2017-05-12 13:32
344 查看
DataGridView有六种列类型,当选择了列类型后对应到该列下的单元格会显示为对应的类型,不过这个类型是设计时指定的,当程序运行时要改变单元格的类型还是比较麻烦的。此文来聊一下如何在运行时改变单元格的类型。
与DataGridView的六种列类型对应的有六种单元格类型,比如与DataGridViewComboBoxColumn列对应的单元格类型为DataGridViewComboBoxCell,其基类为DataGridViewCell,其余五种单元格类型的基类也是DataGridViewCell类。通过DataGridView的rows属性获取指定的行,该行的cells属性获取到的是单元格的集合类型为DataGridViewCellCollection,通过cells[0]方式获取到的单元格类型为DataGridViewCell。到此,一种改变单元格类型的思路就出来了,既然单元格的类型为DataGridViewCell,那么把DataGridViewCell子类的一个对象赋值给它当然是可以的,这样就实现了单元格类型的改变。代码如下。
代码同时实现了改变了类型后的单元格可以编辑。
this.dgv_Data.ReadOnly = false; //设置DataGridView全局非只读即可以编辑其单元格
注:上面代码运行时必须在选中单元格后再单击可以编辑即可以进行选择,操作上就表现为必须单击两次(不是双击)才能进行编辑。暂时没有找到解决的办法,请大神指点。
与DataGridView的六种列类型对应的有六种单元格类型,比如与DataGridViewComboBoxColumn列对应的单元格类型为DataGridViewComboBoxCell,其基类为DataGridViewCell,其余五种单元格类型的基类也是DataGridViewCell类。通过DataGridView的rows属性获取指定的行,该行的cells属性获取到的是单元格的集合类型为DataGridViewCellCollection,通过cells[0]方式获取到的单元格类型为DataGridViewCell。到此,一种改变单元格类型的思路就出来了,既然单元格的类型为DataGridViewCell,那么把DataGridViewCell子类的一个对象赋值给它当然是可以的,这样就实现了单元格类型的改变。代码如下。
代码同时实现了改变了类型后的单元格可以编辑。
this.dgv_Data.ReadOnly = false; //设置DataGridView全局非只读即可以编辑其单元格
//单击事件 private void dgv_Data_CellContentClick(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex < 0) return; //实例化一个DataGridViewComboBoxCell对象,用于下面单元格类型的改变 DataGridViewComboBoxCell cbb = new DataGridViewComboBoxCell(); cbb.Items.Add("true"); cbb.Items.Add("false"); cbb.ReadOnly = false; //设置comboBox可编辑 //获取当前列的头部标题 string headerText = this.dgv_Data.Columns[e.ColumnIndex].HeaderText; switch (headerText) { case "操作": //获取要编辑的单元格的值,按值改变单元格编辑时的类型 string cellValue = this.dgv_Data.Rows[e.RowIndex].Cells["Value"].Value.ToString(); //若为bool值,则编辑时转换为下拉列表类型 if (cellValue == "true"||cellValue=="false") { this.dgv_Data.Rows[e.RowIndex].Cells[e.ColumnIndex].Selected = false; this.dgv_Data.Rows[e.RowIndex].Cells["Value"].ReadOnly = false; this.dgv_Data.Rows[e.RowIndex].Cells["Value"] = cbb; //this.dgv_Data.Rows[e.RowIndex].Cells["Value"].Selected = true; cbb.DisplayStyleForCurrentCellOnly = true; cbb.Selected = true; //将指定单元格以外的的单元格(或者行、列)的ReadOnly设置为true,只有指定的单元格可以编辑。这是实现指定单元格可以编辑的关键 foreach (DataGridViewRow row in this.dgv_Data.Rows) { foreach (DataGridViewCell cell in row.Cells) { if (cell!= this.dgv_Data.Rows[e.RowIndex].Cells["Value"]) { cell.ReadOnly = true; } } } } break; default: break; } }
注:上面代码运行时必须在选中单元格后再单击可以编辑即可以进行选择,操作上就表现为必须单击两次(不是双击)才能进行编辑。暂时没有找到解决的办法,请大神指点。
相关文章推荐
- DataGridView指定单元格的编辑状态与修改
- DataGridView单元格退出编辑模式时发生
- ① DataGridView 取得或者修改当前单元格的内容:
- datagridview动态锁定一列不允许用户修改其宽度
- 动态修改DataTable中某列的值并绑定到DataGridView
- winform中DatagridView单元格动态绑定控件
- GridView动态绑定数据、编辑、修改、删除及分页功能
- 设置DataGridView 显示自己添加编辑的列名,不动态显示数据库本身的列名
- 动态编辑母版页(与母版页通信,如修改控件属性等)
- DataGridView中指定的单元格不能编辑
- dataGridView为单元格动态添加按钮控件
- DataGridView 单元格编辑后焦点移动到该行的另外一列而不换行
- DataGridView取得或者修改当前单元格的内容:
- asp.net动态编辑母版页(与母版页通信,如修改控件属性等)
- DataGridView中对各种类型的单元格控件的事件处理(DataGridViewCheckBoxCell、DataGridViewComboBoxCell等的选定、事件触发)
- GridView动态绑定数据、编辑、修改、删除及分页功能
- asp.net动态编辑母版页(与母版页通信,如修改控件属性等)
- datagridview同列不同行动态嵌套不同类型控件
- 利用datagridview控件编辑数据库,并实现源数据库实时修改
- DataGridView 中指定的 单元格 不能编辑