DataGridView.CellContentClick

如果我非常快速地鼠标单击DataGridViewCheckBoxCell,DataGridView.CellContentClick不会触发。 我怎么解决这个问题? 我需要知道CheckBox的检查状态何时发生变化

尝试处理CellMouseUp事件。 您可以检查MouseUp事件发生的列,以查看它是否是您的复选框列。 您还可以查看它是否处于编辑模式并以编程方式结束编辑模式,这反过来将触发CellValueChanged事件。

在下面的示例中,我有一个包含两个列的datagridview。 第一个是文本框列,第二个是复选框列。 当复选框改变时,第一列将反映其检查状态,而不必从行或单元格移动。

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

HTH

科尔比非洲

无论用户在复选框单元格中单击的速度如何,该值都不会从true更改为false,反之亦然,直到他们单击该行,并且DataGridView退出编辑模式。

我过去所做的,将该列设置为ReadOnly = true。 然后,在CellContentClick事件处理程序中,如果单击该列,我手动翻转bool,如下所示:

 bool b = (bool)this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value; this.dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = !b; 

然后,您可以在此处执行您通常用于CheckChanged的逻辑。

我参加派对有点晚了,但msdn对这个问题有很好的答案。

 'Ends Edit Mode So CellValueChanged Event Can Fire Private Sub EndEditMode(sender As System.Object, e As EventArgs) _ Handles DataGridView1.CurrentCellDirtyStateChanged 'if current cell of grid is dirty, commits edit If DataGridView1.IsCurrentCellDirty Then DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit) End If End Sub 

我还写了一个非常详细的msdn修复程序的详细说明,以及发布在DataGridView CellValueChanged事件上的文章

最好处理CellContentClick事件(如果你在盒子外面意外点击,它将无法正常工作):

 grid.CellContentClick += delegate(object obj, DataGridViewCellEventArgs args) { var cell = (settings_grid[args.ColumnIndex,args.RowIndex] as DataGridViewCheckBoxCell); if (cell != null) { bool new_value = !(bool)cell.Value; RecordTheNewState(new_value); // you record the new checkbox state } };