如果我以非常快的速度单击DataGridViewCheckBoxCell,则DataGridView.CellContentClick不会触发。我该如何解决这个问题呢?我需要知道CheckBox的复选状态何时更改
发布于 2008-12-22 15:22:00
尝试处理CellMouseUp
事件。
您可以检查发生MouseUp
事件的列,看看它是否是您的复选框列。
您还可以确定它是否处于编辑模式,并以编程方式结束编辑模式,这将触发CellValueChanged
事件。
在下面的示例中,我有一个包含两列的DataGridView。
第一个是DataGridViewTextBoxColumn
,第二个是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();
}
}
}
发布于 2008-12-19 14:41:54
无论用户在复选框单元格中单击的速度有多快,该值都不会从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所做的那样,在这一点上执行逻辑。
发布于 2013-01-21 11:35:07
我来晚了一点,但是msdn对这个问题有一个非常好的答案here。
'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修复的详细说明,以及在这里的帖子Firing The DataGridView CellValueChanged Event Immediately上找到的那些修复。
https://stackoverflow.com/questions/381072
复制相似问题