web-dev-qa-db-ja.com

DataGridViewの検証とセル値の変更

検証中に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"];と表示されている行は、期待どおりに動作していません。

24
Micah

CellValidatingイベントは、DataGridViewが編集モードを終了する直前に発生します。これは、編集コントロールに関連する/関連するイベントです(DataGridView.EditingControl)。このイベントのハンドラーでセル値を変更しようとしないでください。イベントをキャンセルしない限り(この場合、ユーザーは編集モードのままです)、セル値は編集コントロールの直後の値に設定されます。イベントが終了します。したがって、これにより、ハンドラーで実行したアクションが取り消されます。

代わりに、編集コントロールの値を変更する必要があります(イベントをキャンセルしないことを思い出してください)。たとえば、DataGridViewTextBoxCellの場合、問題のある行の代わりに以下を使用します。

unit_List_2_GroupsDataGridView.EditingControl.Text = Convert.ToString(rows[0]["Batch"]);

これで問題が解決するはずです。

43
Bradley Smith

一般に、セルの値を変換/変更する必要がある場合は常に CellParsing イベントを使用することをお勧めします。そのイベント内から、セルまたは行の ErrorText 値を設定することにより、ユーザーの値が無効であることを示すことができます。

5
drwatsoncode