我使用的dataGrid的其中一列中有一个复选框。我想检测何时单击和取消选中此复选框,然后执行某些操作,所以我这样做了:
private void dataGridView2_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
Trace.WriteLine("Cell Content Click Col: " + e.ColumnIndex + " Row: " + e.RowIndex);
if(e.ColumnIndex==0) //it is a check
{
Trace.WriteLine("Value:"+ dataGridView2.Rows[e.RowIndex].Cells[e.ColumnIndex].Value);
}
dataGridView2.CommitEdit(DataGridViewDataErrorContexts.Commit); //This has to be put here in order for CellValueChanged to work
//see https://stackoverflow.com/a/11844206/4451521
}
private void dataGridView2_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
Trace.WriteLine("Cell value changed " + e.ColumnIndex + " Row: " + e.RowIndex);
Trace.WriteLine("Value:" + dataGridView2.Rows[e.RowIndex].Cells[e.ColumnIndex].Value);
if(e.ColumnIndex==0&& (bool)dataGridView2.Rows[e.RowIndex].Cells[e.ColumnIndex].Value==true)
{
dataGridView2.Rows[e.RowIndex].Cells["Quantity"].Value = 1.0;
}
else if (e.ColumnIndex == 0 && (bool)dataGridView2.Rows[e.RowIndex].Cells[e.ColumnIndex].Value == false)
{
dataGridView2.Rows[e.RowIndex].Cells["Quantity"].Value = 0;
}
Trace.WriteLine("----------------------------");
Merge();//an algorithm to merge rows when necessary
}
现在,这种方法在99%的时间内都非常有效。 每次单击复选框(第0列),我都会得到
Cell Content Click Col: 0 Row: 4
Value:False
Cell value changed 0 Row: 4
Value:True
Cell value changed 4 Row: 4
Value:1
因此将其从False更改为True并将第4列设置为1。
每次我取消选中它都会得到
Cell Content Click Col: 0 Row: 4
Value:True
Cell value changed 0 Row: 4
Value:False
Cell value changed 4 Row: 4
Value:0
这次将其从True更改为False,并将第4列设置为0
但是,如果我开始玩支票并多次取消支票,有时有时,即使我将其选中(或取消选中-在两种情况下都会发生),功能CellContentClick
不会注册。
这意味着即使我“单击了内容”(通过选中或取消选中该内容)也未调用该函数。导致不良行为,即检查了该列,但第4列的值不是1(反之亦然)
这偶尔会发生,但我想知道为什么会发生这种情况以及如何纠正它。
编辑:
尝试了“重复”问题中建议的answer,但实际上不起作用。此外,这使情况变得更糟。在最初的问题中,有时(占案例的1%)单击不起作用,但是再次单击则一切正常。 在另一个问题中,答案(尝试CellClick)不会更改其他列。更糟糕的是,一旦它不起作用,它就无法在所有其他方面发挥作用。 例如,我检查了该值,而该值未更改。然后我取消选中它,然后 now 值更改为1(而不是0!)。当我再次检查时,t变为0(而不是1!)。该解决方案不起作用
答案 0 :(得分:-1)
这就是您需要做的: