如果我非常快速地鼠标单击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;
Run Code Online (Sandbox Code Playgroud)
然后,您可以在此时执行您通常对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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
31517 次 |
| 最近记录: |