2

私は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イベントが発生し、コミットエラーを報告します。また、コミットエラーを回避する方法は?何が起こっている?

4

1 に答える 1

0

CellValueChanged イベントでセル検証ロジックを実装できます。このイベントは、セルの値が編集されるとトリガーされます。

于 2012-11-07T11:24:34.563 に答える