用于检查更改的DataGridView事件

时间:2014-03-09 15:42:00

标签: c# winforms events datagridview

我有一个DataGridView,其中包含一堆列以及一个名为 IsChecked 的checkBoxColumn。

我想在行检查状态发生变化时引发事件。检查或取消选中行可以在用户单击checkBox时或在行上按 space 键时完成。

这是我将checkBoxColumn添加到我的网格的方式:

dgvMain.Columns.Add(new DataGridViewCheckBoxColumn { 
            Name = "IsChecked" , 
            Width = 20, 
            Visible = false,
            HeaderText = "",
            SortMode = DataGridViewColumnSortMode.NotSortable,
            DisplayIndex = Columns.Count, //to be displayed as last column
            ValueType = typeof(bool),
            FalseValue = false,
            TrueValue = true
        });

这就是我按下空格键时检查单元格的方法:

private void dgvMain_KeyDown(object sender, KeyEventArgs e)
{
     foreach (DataGridViewRow row in dgvMain.SelectedRows)
     {
         bool? checkState = (bool?)row.Cells["IsChecked"].Value;
         if (checkState == null || checkState == false)
             checkState = true;
         else
             checkState = false;
         row.Cells["IsChecked"].Value = checkState;
     }

}

尝试#1:
我尝试使用CellEndEdit事件,这只有在您使用鼠标检查单元格时才有帮助,但是当我按空格键并且单元格检查/取消检查时CellEndEdit不会触发。

尝试#2:
我尝试使用CellValueChanged事件,当我按空格时工作正常,还有当我使用鼠标检查框并留下行但是当我多次检查并取消选中该框时,没有发生。当单元格通过鼠标完成编辑时,似乎CellValueChanged会升起。

尝试#3:
我也尝试使用CurrentCellDirtyStateChanged响应由鼠标引起的第一次检查更改,但不响应快速检查的更改鼠标,仅响应第一个以及离开行时。 我希望捕获所有已检查的更改,即使用户通过单击复选框快速更改已检查状态也是如此。

我不确定是否已经有任何事件用于此目的。如果没有,我如何以编程方式为该列添加eventHandler?

3 个答案:

答案 0 :(得分:4)

CurrentCellDirtyStateChanged事件处理程序中,触发EndEdit,以便触发值更改事件。

void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
    if (dataGridView1.IsCurrentCellDirty && dataGridView1.CurrentCell.ColumnIndex == CheckColumnIndex)
    {
        dataGridView1.EndEdit();
    }
}

CellValueChanged事件处理程序中,从CheckBoxColumn中获取值。

void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex == CheckColumnIndex)
    {
        DataGridViewCheckBoxCell checkCell = (DataGridViewCheckBoxCell)dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];
        bool achecked = Convert.ToBoolean(checkCell.Value);
    }
}

答案 1 :(得分:2)

您可以使用CellValueChanged事件获取复选框值:

private void dgvMain_CellValueChanged(object sender, 
                                          DataGridViewCellEventArgs e)
{
    foreach (DataGridViewRow row in dgvMain.Rows) 
    {
       if (row.Cells["RowWithCheckBox"].Value != null &&(bool)row.Cells["RowWithCheckBox"].Value)
       {
          //do something
       }
    }
}

答案 2 :(得分:0)

如果适合您,请查看CellValidatingCellValueChanged事件。