検証中にDataGridViewのセルを操作して、ユーザーがデータベースに対して無効な値を入力したが、簡単に有効なデータに変換された場合、プログラムによって値が適切な値に変更されるようにします。
値を適切に検証できますが、有効な値に変更しようとすると、DataErrorが発生します。これが私のコードです:
private void unit_List_2_GroupsDataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
Console.WriteLine("Validating");
DataGridViewColumn col = this.unit_List_2_GroupsDataGridView.Columns[e.ColumnIndex];
DataGridViewCell cell = this.unit_List_2_GroupsDataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex];
if (col == this.batchDataGridViewTextBoxColumn && this.unit_List_2_GroupsDataGridView.IsCurrentCellInEditMode)
{
Console.WriteLine(" Batch Column");
DataRow[] rows = label_EntryDataSet.viewJobBatchList.Select(String.Format("Job={0} AND Display='{1}'"
, comboBox1.SelectedValue, e.FormattedValue));
if (rows.Length == 1)
{
Console.WriteLine(" Auto Completed item from list: {0}", rows[0]["Batch"]);
//e.Cancel = true;
cell.Value = rows[0]["Batch"];
//this.unit_List_2_GroupsDataGridView.EndEdit();
}
else
{
Console.WriteLine(" No Autocomplete!");
int i = 0;
if (!int.TryParse(e.FormattedValue.ToString(), out i))
{
Console.WriteLine(" Not an integer either");
e.Cancel = true;
}
}
}
}
cell.Value = rows [0] ["Batch"];と表示されている行は、期待どおりに動作していません。
CellValidating
イベントは、DataGridView
が編集モードを終了する直前に発生します。これは、編集コントロールに関連する/関連するイベントです(DataGridView.EditingControl
)。このイベントのハンドラーでセル値を変更しようとしないでください。イベントをキャンセルしない限り(この場合、ユーザーは編集モードのままです)、セル値は編集コントロールの直後の値に設定されます。イベントが終了します。したがって、これにより、ハンドラーで実行したアクションが取り消されます。
代わりに、編集コントロールの値を変更する必要があります(イベントをキャンセルしないことを思い出してください)。たとえば、DataGridViewTextBoxCell
の場合、問題のある行の代わりに以下を使用します。
unit_List_2_GroupsDataGridView.EditingControl.Text = Convert.ToString(rows[0]["Batch"]);
これで問題が解決するはずです。
一般に、セルの値を変換/変更する必要がある場合は常に CellParsing イベントを使用することをお勧めします。そのイベント内から、セルまたは行の ErrorText 値を設定することにより、ユーザーの値が無効であることを示すことができます。