5

EditOnF2 に設定された DataGridView があります。セルの値を設定する CellEndEdit イベント ハンドラでデータの特別な処理を行います。Esc キーが押されたときに元の値に戻る EditOnKeystrokeOrF2 の機能が必要です。残念ながら、CellEndEdit イベント ハンドラでは、CellEndEdit イベントが発生した原因を特定する方法がわかりません。Esc キーが押されていない場合にのみセルの値を変更したい。それがあったかどうかはどうすればわかりますか?

編集: セルが編集されているとき、または最後の終了キーストロークに対して KeyDown イベントが発生しないことに注意してください。

Edit2: KeyPreview の提案を試しましたが、フォームは押された Escape キーをまだキャプチャしません。

Edit3:これを機能させるために実験を行ってきました。元々、以下のいくつかを別の投稿として投稿しましたが、ここに含める方がより関連性があると感じています.

EditProgrammatically に設定されている DataGridView にセルがあります。編集を開始するキーストロークをキャプチャするために、cell.Value をキーストロークに等しく設定しています。ただし、これはセルの「エスケープ」機能を台無しにします。エスケープを押すと、元の値に戻るのではなく、プログラムでセルに挿入したキーストロークに戻ります。

セルに「EditedFormattedValue」を設定できれば、キーストロークの値を入力したい場所になると思いますが、これは読み取り専用のようです。私が試みていることをどのように達成できますか?

明確にする例:セルに「54.3」の値があり、「9」キーを押すと、セルの編集が開始され、そこに「9」が配置されます。Escape を押すと、「54.3」ではなく「9」に戻ります。私が欲しいのは、元の値「54.3」に戻ることです。

ですから、私はこの問題に最初から最後まで取り組んでいます。本当の問題は、元の値を上書きしていて、元に戻す必要があるかどうかを判断する方法がないことだと思います。

Edit4: CellValidating を使用する価値があるように見えますが、実験すると奇妙な動作が見られます。新しいプロジェクトで、DataGridView を作成し、さまざまなイベントに登録して、CellValidating が CellEndEdit の前に起動されることを確認します。ただし、これを機能させようとしている私のプロジェクトでは、CellEndEdit が CellValidating の前に起動しています。違いが何であるかについてのアイデアはありますか?

4

3 に答える 3

2

フォームのKeyPrevew プロパティを true に設定します。これにより、コントロールが最初にそれを飲み込むのを防ぎます。:)

于 2009-04-21T21:12:41.193 に答える
0

まず、あなたは絶対に正しいです、うまくKeyPreviewいきません。最初は、フォームのIsInputKeyメソッドをオーバーライドすることでこれを回避できると考えていました。この手法は、キャッチする必要のあるキーをキャッチできなかった他のいくつかのケースで機能しました。それもうまくいかなかったので、サブクラス化しDataGridViewてオーバーライドIsInputKeyしてみました。それもうまくいきませんでした。オーバーライドできる他のメソッドを掘り下げた後、インターセプトする必要があるコマンド キーと呼ばれる別のクラスのキーがあることを知りました。これを行うには、 ProcessCmdKeyをオーバーライドしますDataGridView(サブクラス化する必要があります)。

これが私のコードです:

public class CommandKeyInterceptingDataGridView : DataGridView
{
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        Debug.WriteLine(keyData);
        return base.ProcessCmdKey(ref msg, keyData);
    }
}

そして、F2 で編集モードに入り、セルを「こんにちは」と言うように変更し、Escape で編集をキャンセルした出力。

F2
ShiftKey, Shift
H, Shift
E
L
L
O
Escape

うまくいけば、これで必要なものが得られます。

于 2010-06-10T13:58:26.940 に答える
0

私の問題は似ていましたが、私の回避策は次のとおりです。

Problem:ユーザーが DGV でセル値の編集を開始し、値をコミットする前に ESC キーを押した場合 EndEdit が呼び出され、すべての DGV フィールドがデータベースに再書き込みされ、更新日時フィールドが更新されました。実際に値を変更し、その間に ESC を押しませんでした。

Solution:セル検証では、このようなフラグを使用して値が変更されたかどうかを確認し、フラグ値が false の場合はif(!flag)return;EndEditで実行するだけです

于 2012-01-17T21:23:38.163 に答える