动态修改DataGridView单元格的类型和编辑单元格

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;
            }
        }

注:上面代码运行时必须在选中单元格后再单击可以编辑即可以进行选择,操作上就表现为必须单击两次(不是双击)才能进行编辑。暂时没有找到解决的办法,请大神指点。

你可能感兴趣的:(WinForm)