强制在某些条件下检查DataGridView CheckBox

时间:2012-06-27 10:37:33

标签: c# winforms events datagridview checkbox

所有,我想做的事情很简单(或者我认为)。我目前有DataGridView个复选框,用于指示用户是否应该处理。有些进程依赖于其他进程,所以我强制使用

检查依赖进程
private void dataGridViewProcess_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex == (int)ProcessColumns.Error)
    {
        if (!String.IsNullOrEmpty(dataGridViewProcess.Rows[e.RowIndex]
                                  .Cells[e.ColumnIndex].Value.ToString()))
        {
            Utils.ErrMsg(String.Format("{0}", 
                (String.IsNullOrEmpty(siteReportArr[currentSite, e.RowIndex]) ?
                "Error message currently unavalible. Try again later." : 
                siteReportArr[currentSite, e.RowIndex])));
        }
    }
    dataGridViewProcess.CommitEdit(DataGridViewDataErrorContexts.Commit);
}

private void dataGridViewProcess_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    if (!bInLoadEvent && e.RowIndex >= 0)
    {
        if (e.RowIndex == (int)CurrentProcess.N)
        {
            DataGridViewRow rowA = dataGridViewProcess.Rows[e.RowIndex];
            DataGridViewRow rowB = dataGridViewProcess.Rows[e.RowIndex + 1];
            if (Convert.ToBoolean(rowA.Cells[(int)ProcessColumns.Process].Value) 
                == false)
            {    
                rowB.Cells[(int)ProcessColumns.Process].Value = false;
            }
        }
        ...
        else if (e.RowIndex == (int)CurrentProcess.C)
        {
            DataGridViewRow rowB = dataGridViewProcess.Rows[e.RowIndex];
            DataGridViewRow rowA = dataGridViewProcess.Rows[e.RowIndex - 1];
            if (Convert.ToBoolean(rowA.Cells[(int)ProcessColumns.Process].Value) 
                == true)
            {
                rowB.Cells[(int)ProcessColumns.Process].Value = true;
            }
        }
    }
}

所有这些程序更改都可以正常工作,最后一个显示在dataGridViewProcess_CellValueChanged事件中。在这里,如果选中C之前的进程并且用户尝试取消选中C,我想强制它继续检查。我目前无法做到这一点。

我尝试使用DataGridView Validated事件,并使用CellDirtyStateChanged事件无济于事。对此(看似非常基本)问题的任何帮助都将非常感激。

感谢您的时间。

1 个答案:

答案 0 :(得分:2)

我认为问题在于您处于事件处理链中。我复制了你的代码并修改了一下。关键是最后一个条件是(可能)是您修改当前正在编辑的单元格的唯一条件。我发现代码按预期执行,但复选框不会更改 - 直到复选框失去焦点,在这种情况下更改为正确的值。我通过更改dataGridViewProcess_CellContentClick中的以下行从

开始工作
dataGridViewProcess.CommitEdit(DataGridViewDataErrorContexts.Commit);

dataGridViewProcess.EndEdit();

您将在MSDN here上注明,CommitEdit并未结束实际编辑。