如果我非常快速地鼠标单击DataGridViewCheckBoxCell,DataGridView.CellContentClick不会触发.我怎么解决这个问题?我需要知道CheckBox的检查状态何时发生变化
无论用户在复选框单元格中单击的速度有多快,该值都不会从true变为false,反之亦然,直到他们单击该行之外,并且DataGridView退出编辑模式。
我过去所做的就是将该列设置为ReadOnly = true。然后,在CellContentClick事件处理程序中,如果单击了该列,我将手动翻转布尔值,如下所示:
bool b = (bool)this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value; this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = !b;
然后,您可以在此时执行您通常对CheckChanged执行的逻辑。
尝试处理CellMouseUp
事件.
您可以检查MouseUp
事件发生的列,以查看它是否是您的复选框列.
您还可以查看它是否处于编辑模式并以编程方式结束编辑模式,这反过来将触发CellValueChanged
事件.
在下面的示例中,我有一个带有两个列的DataGridView.
第一个是a DataGridViewTextBoxColumn
,第二个是a DataGridViewCheckBoxColumn
.
当复选框改变时,第一列将反映其检查状态,而不必从行或单元格移动.
public partial class Form1 : Form { public Form1() { InitializeComponent(); dataGridView1.Rows.Add("False", false); dataGridView1.Rows.Add("True", true); } private void dataGridView1_CellMouseUp(object sender, DataGridViewCellMouseEventArgs e) { if (e.ColumnIndex == 1 && e.RowIndex >-1 && dataGridView1.Rows[e.RowIndex].Cells[1].IsInEditMode) { dataGridView1.EndEdit(); } } private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex != -1) { dataGridView1.Rows[e.RowIndex].Cells[0].Value = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString(); } } }