听一个复选框

时间:2014-02-07 15:00:17

标签: c# winforms datagridview

我找到了几个帖子"答案"对此,但他们都没有为我工作。为什么某些事情应该如此容易如此困难?

我想要的是回复某人检查/取消选中一列复选框。一种解决方案大部分时间都有效,但有时事件并未被触发。我在几个地方看过的那个建议是这样的:

 private void dgv1_CurrentCellDirtyStateChanged(object sender, EventArgs e) {
        if (dgv1.IsCurrentCellDirty) {
            dgv1.CommitEdit(DataGridViewDataErrorContexts.Commit);
        }
}
private void dgv1_CellValueChanged(object sender, DataGridViewCellEventArgs e) {
    // Do whatever I want to do.
}

不幸的是,CellValueChanged根本就没有被调用。 我已检查并仔细检查是否添加了两个侦听器:

dgv1.CellValueChanged += new DataGridViewCellEventHandler(dgv1_CellValueChanged);
dgv1.CurrentCellDirtyStateChanged += new EventHandler(dgv1_CurrentCellDirtyStateChanged);

我向这两个方法添加了print语句,以验证即使是CurrentCellDirtyStateChanged方法也永远不会调用CellValueChanged方法。我做错了什么?

修改 我正在使用DataTable与此DataGridView。听听那会更好吗?在我离开单元格之前,是否在DataTable中发生了变化?

2 个答案:

答案 0 :(得分:1)

试一试。但这次是CellContentClick事件。

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    switch (e.ColumnIndex)
    {
        case 0: //Where the DataGridViewCheckBoxColumn Index
            dataGridView1[e.ColumnIndex, e.RowIndex].Value = 
                !(bool) dataGridView1[e.ColumnIndex, e.RowIndex].Value;
            if ((bool)dataGridView1[e.ColumnIndex, e.RowIndex].Value)
            {
                //Something to do
            }
            break;
    }
}

选项:您可以将DataGridViewCheckBoxColumn属性设置为readonly = true

答案 1 :(得分:0)

我的工作实现也使用了这种方法,但它略有不同:

private void table_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
    // Because I want to respond immediately to the user changing the state of one of the "excluded" cells,
    // I have to detect the dirty state of such a cell changing, then call CommitEdit() in order to explicitly
    // cause the CellValueChanged() event to be raised.

    if (_table.CurrentCellAddress.X == _colExcluded.DisplayIndex)
    {
        _table.CommitEdit(DataGridViewDataErrorContexts.Commit);
    }
}

在这种情况下,_colExcluded.DisplayIndex恰好就是我如何检查是否点击了正确的列。

与您的代码的不同之处在于,在调用CommitEdit()之前,我不会检查当前单元格是否为脏。我认为这可能是个问题。