0

所有,我想做的很简单(或者我是这么认为的)。我目前有一个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事件无济于事。对于这个(看似非常基本的)问题的任何帮助将不胜感激。

谢谢你的时间。

4

1 回答 1

2

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

dataGridViewProcess.CommitEdit(DataGridViewDataErrorContexts.Commit);

dataGridViewProcess.EndEdit();

您将在 MSDN 上注意到CommitEdit不会结束实际编辑。

于 2012-06-27T11:42:54.630 回答