私はDataGridView
カスタムを持っていますDataGridViewColumn
。この列は、サードパーティのコンポーネントをホストしています。セルで編集モードに入り、その値を変更してから、Enterキーを押して値を検証します。問題は、値を検証するためにEnterキーを2回押す必要があることです。最初のEnterキーは、セルでホストされているサードパーティのエディターで値を検証し、2番目のEnterキーは、セルを検証するDataGridView
ようです...では、Enterキーを1回押すだけで、セルの値を検証する方法はありますか?
また、奇妙な動作も見ました。たとえば、最後の行は残りのセルのDataGridView
ようには動作しません。DataGridView
最後の行では、セルの値を編集してからEnterキーを押して検証すると、値を検証した後、常に同じセルに残り、編集モードになり、セルの値が選択されるため、ユーザーはセルの値が無効であると考えることができます。実際にはそうではありません。これは、残りの行では発生しません。検証するにはEnterキーを2回押す必要があり、検証後もセルは編集モードのままになりません。
編集:Enterキーを2回押す必要性について:カスタムセルでは、Enterキーを初めて押すと、セルの値が変更されたことを示すイベントが発生します。この場合は、OnSourceValueChanged(これは値が変更されたときにサードパーティのために発生したイベント)ので、私はそれを行います:
this.valueChanged = true;
this.EditingControlDataGridView.NotifyCurrentCellDirty(true);
base.OnSourceValueChanged(e);
NotifyCurrentCellDirtyを実行すると、datagridviewでCurrentCellDirtyStateChangedが発生します。コードは次のとおりです。
if (this.gridView.IsCurrentCellDirty)
{
this.gridView.CurrentCell.DataGridView.EndEdit(DataGridViewDataErrorContexts.Commit);
this.gridView.EndEdit(DataGridViewDataErrorContexts.Commit);
}
その後、datagridviewに対してDataErrorイベントが発生しますが、セルは編集モードで続行されるため、値をコミットして編集モードを終了します。これを行う方法?また、私は試しました:
this.dataGridView.CurrentCell.DataGridView.EndEdit(DataGridViewDataErrorContexts.Commit);
this.dataGridView.EndEdit(DataGridViewDataErrorContexts.Commit);
DataErrorハンドラー内にありますが、機能しません。
最後に、cellvaluechangedはセル内のホストされたコントロールであるため、発生しません...セルの変更をコミットして検証し、セルの編集モードを終了するためにEnterキーを2回押す必要がある理由がわかりません。エンターキーを1回押すだけにしたい。
おそらく原因は、CurrentCellDirtyStateChangedでのコミット後にエラーが発生したことです。DataErrorイベントが発生し、コミットエラーを報告します。また、コミットエラーを回避する方法は?何が起こっている?