25

検証時に 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"];を読み取る行。私が期待することをしていません。

4

2 に答える 2

46

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

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

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

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

于 2011-01-20T03:04:43.600 に答える
5

In general, it is better to use the CellParsing event whenever you need to convert/change the value in a cell. From within that event, you can indicate that the user's value is invalid by setting the ErrorText value of the cell or row.

于 2013-11-21T14:22:42.303 に答える