所有,我想做的事情很简单(或者我认为)。我目前有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
事件无济于事。对此(看似非常基本)问题的任何帮助都将非常感激。
感谢您的时间。
答案 0 :(得分:2)
我认为问题在于您处于事件处理链中。我复制了你的代码并修改了一下。关键是最后一个条件是(可能)是您修改当前正在编辑的单元格的唯一条件。我发现代码按预期执行,但复选框不会更改 - 直到复选框失去焦点,在这种情况下更改为正确的值。我通过更改dataGridViewProcess_CellContentClick
中的以下行从
dataGridViewProcess.CommitEdit(DataGridViewDataErrorContexts.Commit);
到
dataGridViewProcess.EndEdit();
您将在MSDN here上注明,CommitEdit并未结束实际编辑。