YAmaGNZ さんが回答されてますが、KeyPress イベントでは Text プロパティに反映されていません。
SelectionStart プロパティと、SelectionLength を使って、左と右にテキストを分けてください。
csharp
1protected void GetUnSelectedText(out string left, out string right)2{3 string prevText = base.Text;4 left = prevText.Substring(0, SelectionStart);5 right = prevText.Substring(SelectionStart + SelectionLength);6}
通常文字を入力すると、反映された後のテキストは 左 + 入力文字 + 右 になります。
原則として、反映された後、テキストがどうなるかを予測してチェックします。
数値チェックについては Decimal.TryParse を使ったほうがいいのではないでしょうか。
先頭か後ろにしか符号を入力できなくする手もあります。
また、数値の場合、"." を消してしまうと、"1.000" → "1000" になってしまうので注意が必要です。
"." を消したら、右側をクリアするといいかもしれません。
考慮しなければいけないのは、数字や記号だけではありませんし、ウインドウメッセージにも注意する必要があります。
1.考慮するキャラクタ
(1) BackSpace
選択している文字がある場合、選択された文字列が消えます。選択する文字が無い場合は、現在のカーソルの左1文字が消えます。
(2) CTRL+A(全選択)
そのまま通します。
(3) CTRL+C(COPY)
テキストが変わらないのでそのまま通します。
(4) CTRL+V(PASTE)
コンテキストメニューから貼り付けできるため、WM_PASTE をキャッチして処理したほうが良いです。
(5) CTRL+X(CUT)
コンテキストメニューから切り取りできるため、WM_CUT をキャッチして処理したほうが良いです。
(6) CTRL+Z(UNDO)
コンテキストメニューから元に戻せるため、WM_UNDO をキャッチして処理したほうが良いです。
ただし、UNDO 後のテキストを予測するのは困難なため、禁止(無視)したほうが良いかもしれません。
(7) Delete
選択している文字がある場合、選択された文字列が消えます。選択する文字が無い場合は、現在のカーソルの右1文字が消えます。
ただし、これは OnKeyPress には入ってこないので、OnKeyDown で処理してください。
2.考慮するウインドウメッセージ
(1) WM_CUT/WM_CLEAR
選択された文字列が消えます。
(2) WM_PASTE
選択された文字列が消え、クリップボードの内容に置き換わります。
1文字ずつ加えていき、チェックします。
(3) WM_UNDO
さきほど触れましたが禁止したほうがいいかもしれません。
WndProc を呼んで、反映した後チェックし、不都合があれば元に戻すという荒業もありでしょうか。
こんなところですかね・・・
0 コメント