C#DataGridView(CheckBox)单元格单击多个回调

[C#,Visual Studio 2008,Windows 7 64]

我的课上有一个DataGridView.此数据网格视图使用DataGridViewCheckBoxColumn,以便每个单元格都包含一个复选框.

这是其中一行的屏幕截图:

我希望能够检测用户是否选择了该单元格(该单元格中的某个位置,但未位于复选框的顶部).我还想检测用户是否选中了该复选框.为了做到这一点,我的代码必须为两个事件设置回调:

this.CellClick += cellClick; // callback when the user selects a cell
this.CellContentClick += cellContentClick; // callback when the user selects a checkbox

这是回调方法:

    private void cellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        toggleCellCheck(e.RowIndex, e.ColumnIndex);
    }

    private void cellClick(object sender, DataGridViewCellEventArgs e)
    {
        toggleCellCheck(e.RowIndex, e.ColumnIndex);
    }

    private void toggleCellCheck(int row, int column)
    {
        bool isChecked = (bool)this[column, row].EditedFormattedValue;
        this.Rows[row].Cells[column].Value = !isChecked;
    }

(注意:如您所见,toggleCellCheck方法获取复选框值并将其切换为选中->未选中或未选中->已选中.)

当用户单击非复选框单元格中的任何位置时,仅触发一个回调,即cellClick.随后调用toggleCellCheck方法,复选框状态翻转.

这是我想要的确切行为.

我遇到的问题是,当用户直接单击复选框时,两个事件将按以下顺序触发:cellClick然后cellContentClick.

这两个回调都将导致复选框选中状态在第一个回调之后切换,然后在第二个回调之后再次切换.最终的结果当然是复选框选中的状态不会更改.

有什么方法可以配置DataGridView类来阻止触发两个回调?或者,是否有一种方法可以(在cellContentClick方法内部)检测到这是第二个回调,或者该回调是通过单击复选框生成的,然后直接退出而无需调用toggleCellCheck?

我在想以下内容:

private void cellContentClick(object sender, DataGridViewCellEventArgs e)
{
    // if sender/sender child/etc. is of type checkbox then return because
    // _cellClick_ has already been called to change the checkbox checked property
    // something like the following:
    //
    // if (typeof(sender) == CheckBox) return;
    // else toggleCellCheck(e.RowIndex, e.ColumnIndex);
}

谢谢!

一月

解决方法:

您不需要单元格内容单击处理程序-选中复选框时将调用单元格单击.

看来您的最终目标是使网格响应所单击的单元格内容以及所单击的实际复选框.

为此,只需使用以下内容附加到单元格单击事件:

void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
    if (dataGridView1.Columns[e.ColumnIndex].Name == "checkboxcolumn")
    {
        Console.WriteLine("Click");
        bool isChecked = (bool)dataGridView1[e.ColumnIndex, e.RowIndex].EditedFormattedValue;
        dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = !isChecked;
        dataGridView1.EndEdit();
    }
}

1.我建议不要进行这种ui修改-像DataGridView这样的控件的默认行为已广泛传播并经过了良好的测试.更改它们通常不是一个好主意.

上一篇:Yii 1.1 URL两个笔记 同时支持PATH于GET路由和隐藏index.php


下一篇:DatagridView C#中的额外列