用于检查更改的DataGridView事件

我有一个DataGridView ,它有一堆列和一个名为IsChecked的checkBoxColumn。

我想在行检查状态发生变化时引发事件。 检查或取消选中行可以在用户单击checkBox时或按行上的空格键时完成。

这是我将checkBoxColumn添加到我的网格的方式:

 dgvMain.Columns.Add(new DataGridViewCheckBoxColumn { Name = "IsChecked" , Width = 20, Visible = false, HeaderText = "", SortMode = DataGridViewColumnSortMode.NotSortable, DisplayIndex = Columns.Count, //to be displayed as last column ValueType = typeof(bool), FalseValue = false, TrueValue = true }); 

这就是我按下空格键时检查单元格的方法:

 private void dgvMain_KeyDown(object sender, KeyEventArgs e) { foreach (DataGridViewRow row in dgvMain.SelectedRows) { bool? checkState = (bool?)row.Cells["IsChecked"].Value; if (checkState == null || checkState == false) checkState = true; else checkState = false; row.Cells["IsChecked"].Value = checkState; } } 

尝试#1:
我尝试使用CellEndEdit事件,这只有在您使用鼠标检查单元格时才有帮助,但是当我按空格键并且单元格检查/取消选中时, CellEndEdit不会触发。

尝试#2:
我尝试使用CellValueChanged事件,当我按空格时工作正常,当我使用鼠标检查框并离开行但是当我多次检查并取消选中该框时,没有任何反应。 当单元格通过鼠标完成编辑时, CellValueChanged似乎会升起。

尝试#3:
我也尝试使用CurrentCellDirtyStateChanged来响应由鼠标引起的第一次检查更改,但不响应快速检查的更改鼠标,只响应第一个以及离开行时。 我希望捕获所有已检查的更改,即使用户通过单击复选框快速更改已检查状态也是如此。

我不确定是否已经有任何事件用于此目的。 如果没有,我如何以编程方式为此列添加eventHandler?

CurrentCellDirtyStateChanged事件处理程序中,触发EndEdit以便触发值更改事件。

 void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e) { if (dataGridView1.IsCurrentCellDirty && dataGridView1.CurrentCell.ColumnIndex == CheckColumnIndex) { dataGridView1.EndEdit(); } } 

CellValueChanged事件处理程序中,从CheckBoxColumn获取值。

 void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) { if (e.ColumnIndex == CheckColumnIndex) { DataGridViewCheckBoxCell checkCell = (DataGridViewCheckBoxCell)dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex]; bool achecked = Convert.ToBoolean(checkCell.Value); } } 

您可以使用CellValueChanged事件获取复选框值:

 private void dgvMain_CellValueChanged(object sender, DataGridViewCellEventArgs e) { foreach (DataGridViewRow row in dgvMain.Rows) { if (row.Cells["RowWithCheckBox"].Value != null &&(bool)row.Cells["RowWithCheckBox"].Value) { //do something } } } 

如果适合您,请查看CellValidatingCellValueChanged事件。