2009-04-21 7 views
5

私はEditOnF2に設定されたDataGridViewを持っています。セルの値を設定するCellEndEditイベントハンドラで、データの特別な処理を行います。 Escキーを押したときに元の値に戻すというEditOnKeystrokeOrF2の機能がまだ必要です。残念ながら、CellEndEditイベントハンドラでは、CellEndEditイベントの原因を突き止める方法はありません。 Escキーが押されていないと、セルの値を変更したいだけです。それがあったかどうかはどうすればわかりますか?C#のDataGridViewで "CellEndEdit"をトリガするキーストロークをキャプチャする方法はありますか?

編集:セルの編集中にKeyDownイベントが発生しないことや、最終的な終了キーストロークがないことに注意してください。

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

Edit3:私はこれを動作させようと試みています。私はもともと別々の投稿として以下のいくつかを投稿しましたが、ここにそれを含めることがより適切かもしれないと感じています。

DataGridViewには、EditProgrammaticallyに設定されているセルがあります。編集を開始するキーストロークをキャプチャするには、cell.Valueをキーストロークと同じに設定します。しかし、これはセルの "エスケープ"機能を破壊します。エスケープを押すと、元の値に戻す代わりに、プログラムでセルに挿入したキーストロークに戻ります。

私はセルに "EditedFormattedValue"を設定できたら、これは私がキーストロークの値を入れたい場所になると思っていますが、これは読み取り専用です。私は何をしようとしていますか?

明確な例:セルの値が「54.3」で、「9」キーを押すと、セルの編集が開始され、「9」が配置されます。エスケープを押すと "54.3"に戻るのではなく "9"に戻ります。私が望むのは、それが "54.3"の元の値に戻ることです。

私はこの問題を最初と最後の両方から解決しようとしています。実際の問題は、元の値を上書きして元に戻すべきかどうかを判断できないということです。

Edit4:CellValidatingは価値があるかもしれませんが、実験をすると変な動作が見られます。新しいプロジェクトでは、DataGridViewを作成してさまざまなイベントに登録し、CellEndEditの前にCellValidatingが起動されることを確認します。しかし、私がこの問題を解決しようとしている私のプロジェクトでは、CellEndEditはCellValidatingの前に実行しています。違いが何であるかについてのアイデアは?

答えて

2

フォームのKeyPrevew propertyをtrueに設定します。コントロールが最初にそれを揺さぶるのを防ぎます。 :)

+0

おかげで、これを試した後、それはエスケープキーがあるように見えます編集の終了としてセルによって認識され、フォーム上の実際のKeyDownまたはKeyPressイベントとしては認識されません。 –

0

まず、あなたは絶対に正しく、KeyPreviewは動作しません。最初は、フォームのIsInputKeyメソッドをオーバーライドすることでこの問題を回避できると思いました。このテクニックは、私がキャッチする必要があるキーをキャッチできなかった他のいくつかのケースで私のために働いています。それでもうまくいきませんでしたので、DataGridViewをサブクラス化して、IsInputKeyを上書きしようとしました。それはどちらもうまくいかなかった。私がオーバーライドできる他の方法を掘り下げた後に、私が傍受するのに必要なコマンドキーと呼ばれる別のクラスのキーがあることを知りました。これを行うには、DataGridViewProcessCmdKeyを上書きします(サブクラス化する必要があります)。

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

そして、F2で編集モードに入る「こんにちは」と言って、セルを変更し、エスケープと編集をキャンセルからの出力:

は、ここに私のコードです。

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

これは、必要なものを提供します。

Problem:ユーザーがDGVのセルの値を編集し始め、値EndEditをコミットする前にESCキーを押すと呼ばれていた、データベースへのすべてのDGVフィールドを書いたRE:

0

私の問題は類似していた、ここに私の回避策です更新日&の時間フィールドを更新しました。ユーザーが実際に値を変更したときにDGV.EndEditを実行し、その間にESCを押さなかっただけです。

Solution:は、値が変更された場合のセルの検証では私がチェックするthisのようなフラグを使用してフラグの値がfalseの場合だけEndEditにif(!flag)return;を行う

関連する問題