9

我正在使用这段代码:

// Cell value change event.
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    if ((bool)dataGridView1.CurrentCell.Value == true) MessageBox.Show("true");
    if ((bool)dataGridView1.CurrentCell.Value == false) MessageBox.Show("false");

    MessageBox.Show(dataGridView1.CurrentCell.Value.ToString());
}

它适用于所有列,除了带有复选框 ( DataGridViewCheckBoxColumn)的一列

我需要知道复选框列中的值(真或假)。

我需要为此做些什么?

4

4 回答 4

19

使用DataGridViewCheckBoxColumn有时会有点棘手,因为有一些规则仅适用于Cells该列类型。此代码应处理您遇到的问题。

CurrentCellDirtyStateChanged单击单元格时,该事件会立即提交更改。CellValueChanged您在调用该CommitEdit方法时手动引发事件。

private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    if (dataGridView1.CurrentCell == null) return;
    if ((bool)dataGridView1.CurrentCell.Value == true) MessageBox.Show("true");
    if ((bool)dataGridView1.CurrentCell.Value == false) MessageBox.Show("false");
    MessageBox.Show(dataGridView1.CurrentCell.Value.ToString());
}

private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
    if (dataGridView1.IsCurrentCellDirty)
    {
        dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
    }
}

访问此处以获取有关使用DataGridViewCheckBoxCell.

于 2013-06-24T13:51:36.247 回答
5

MSDN在这里说 CellValueChanged 在单元格失去焦点之前不会触发。

一些解决方案:

DataGridView.CellContentClick

http://codingeverything.blogspot.com/2013/01/firing-datagridview-cellvaluechanged.html

于 2013-06-24T12:59:22.963 回答
1

我想出了一个稍微不同的解决方案。

我使用 CurrentCellDirtyStateChanged 事件来检查该列是否是复选框列,如果是,我手动触发 CellValueChanged 事件,如下所示:

if (DGV_Charge.CurrentCell.ColumnIndex == 0) DGV_Charge_CellValueChanged(null, new DataGridViewCellEventArgs(DGV_Charge.CurrentCell.ColumnIndex, DGV_Charge.CurrentCell.RowIndex));
于 2015-02-16T15:12:52.543 回答
0

最好的办法是通过创建自己的网格来扩展网格,并准备好使用这些不同的“技巧”。相信我,这个网格中有很多东西需要调整。

建议的代码使用

Public Class MyGrid
    Inherits Windows.Forms.DataGridView

    Private Sub MyGrid_CurrentCellDirtyStateChanged(ByVal sender As Object, ByVal e As System.EventArgs) _
                       Handles Me.CurrentCellDirtyStateChanged
        If Me.IsCurrentCellDirty AndAlso Not Me.CurrentCell Is Nothing Then
           If TypeOf Me.Columns(Me.CurrentCell.ColumnIndex) Is DataGridViewCheckBoxColumn Then
              Me.CommitEdit(DataGridViewDataErrorContexts.Commit) 'imediate commit, not only on focus changed
           End If
        End If
    End Sub

    Private Sub MyGrid_CellValueChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) 
                       Handles Me.CellValueChanged
        If e.RowIndex >= 0 AndAlso e.ColumnIndex >= 0 Then
           Dim Checked As Boolean = False
           If TypeOf Me.Columns(e.ColumnIndex) Is DataGridViewCheckBoxColumn Then
              'avoid erros
              Checked = Me.CellChecked(e.RowIndex, e.ColumnIndex)
           End If
           RaiseEvent Change(e.RowIndex, e.ColumnIndex, Checked)
        End If
    End Sub

End Class
于 2013-12-13T16:20:14.520 回答