C# winForm DataGirlView改变列类型,并执行相关事件
图一
在实际的应用软件开发中,对类似表格的格式有着特殊的需求,比如像上面两个就是,图一 项目名称有很多,要求用下拉框显示出来,图二要求用复选框来选择要操作的行
这就要求我们需要改变一下列的类型,并执行相关的操作,下面就来简单说说如何实现这些
一、首先在DataGrilView中改变列的显示类型
在DataGirlView中内置了这些类型,我们只需要根据需要选择下即可,
然后在Item或者相关地方赋值即可,这是手动改变状态,并添加数据,下面看看如何动态添加数据
List<SPItems> lstItems = new SPItems().SelectList("0","",0); DataGridViewComboBoxColumn colShow = new DataGridViewComboBoxColumn(); colShow.Name = "spaceType"; colShow.HeaderText = "项目名称"; colShow.Width = 200; colShow.DataSource = lstItems; colShow.DisplayMember = "Name"; colShow.ValueMember = "ID"; colShow.DisplayIndex = 0; dgvProject.Columns.Insert(1, colShow);
从上面我们可以看到需要先创建定义一个需要的列的类型 DataGridViewComboBoxColumn colShow = new DataGridViewComboBoxColumn();
然后进行相关的赋值操作,最后插入到DataGrilView中即可dgvProject.Columns.Insert(1, colShow);
其次,执行相关的事件,比如根据下拉选中的值,执行相关的操作
正常响应CellValueChanged()事件时,当改变Combox状态时,只有当焦点离开该单元格时才能触发CellValueChanged()事件,
如果要改变Combox值时实时触发CellValueChanged()事件,需要借用CurrentCellDirtyStateChanged()事件来提交未提交控件的更改。
private void dgvProject_CurrentCellDirtyStateChanged(object sender, EventArgs e) { if (dgvProject.IsCurrentCellDirty) { dgvProject.CommitEdit(DataGridViewDataErrorContexts.Commit); } }
这样CellValueChanged()事件就可以随着checkbox的值的改变实时触发;
private void dgvProject_CellValueChanged(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex >= 0 && e.RowIndex != -1 && !dgvProject.Rows[e.RowIndex].IsNewRow) { if (e.ColumnIndex == 1) { string vv = this.dgvProject[e.ColumnIndex, e.RowIndex].Value.ToString(); SPItems item = new SPItems(Convert.ToInt32(vv)); dgvProject.Rows[e.RowIndex].Cells[2].Value = item.BonusMoney; } } }
根据e.ColumnIndex来确定当触发那一列的时候会执行事件
注意:
1、获得值:
DataGridViewCheckBoxCell checkCell = (DataGridViewCheckBoxCell)dgvPayDetails.Rows[i].Cells["SelIndex"];
Boolean flag = Convert.ToBoolean(checkCell.Value);
DataGridViewComboBoxCell checkCell = (DataGridViewComboBoxCell)dgvProject.Rows[i].Cells[1];
int vv =Convert.ToInt32(checkCell.Value);