当前位置:  开发笔记 > 编程语言 > 正文

DataGridView.CellContentClick

如何解决《DataGridView.CellContentClick》经验,为你挑选了2个好方法。

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



1> BFree..:

无论用户在复选框单元格中单击的速度有多快,该值都不会从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执行的逻辑。



2> Colby Africa..:

尝试处理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(); 
        }
    }
}

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有