質問

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)。このイベントのハンドラーのセル値を変更しようとしないでください。イベントをキャンセルしない限り(ユーザーが編集モードでスタックされている場合)、セル値は編集制御の直後に編集コントロールから値に設定されます。イベント終了。したがって、これにより、ハンドラーで実行するアクションが元に戻されます。

代わりにあなたがしなければならないことは、編集コントロールの値を変更することです(イベントをキャンセルしないことを忘れないでください)。たとえば、a DataGridViewTextBoxCell, 、問題のある行の代わりに、次のものを使用します。

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

これにより問題が解決することがわかります。

他のヒント

一般に、使用する方が良いです セルパージング セル内の値を変換/変更する必要があるときはいつでもイベント。そのイベント内から、ユーザーの値が設定することにより無効であることを示すことができます errortext セルまたは行の値。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top