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;
            }
        }
    }
}

これらのプログラムによる変更はすべて、イベントで最後に表示される1つ目のバーでうまく機能します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 に答える