テキストボックスに禁止文字を設定して、入力されてもテキストボックスに入力を反映させないようにする

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 コメント