DOBON.NET DOBON.NETプログラミング掲示板過去ログ

テキストボックスの内容によってDeleteキーによる削除をキャンセルしたい

環境/言語:[Visual Studio 2005]
分類:[.NET]

はじめまして。

現在、数値を入力する専用のテキストボックスカスタムコントロールを作成しています。
整数と小数の両方に対応しており、0.01〜99.99の値が入力できるモノです。

ttp://jeanne.wankuma.com/tips/vb.net/textbox/permitchars.html
上記のサイトのコードを参考にし、
入力文字の制限と入力桁数のチェックを行うテキストボックスが完成しました。
(例えば 10.1 と入力されていたら、少数部には入力できるが整数部には入力できない)

ここで問題が発生しまして、
10.1 と入力されているとき、小数点のみを消すと 101 という入力できてはいけない数字が入ってしまいます。
そこで、削除後の結果が 0.01〜99.99 の範囲外になるときは、
削除処理をキャンセルする仕様にしようと考えました。

Backspaceキーによる削除は
OnCharメソッドでキーの入力感知と、入力のキャンセルが出来るので
削除内容と削除後のテキストボックスの中身をチェックするロジックを組み、
場合に応じて、キャンセルするように出来ました。

しかしDeleteキーによる削除の場合、
OnCharメソッドで入力を拾うことが出来ないらしく
Backspaceのときと同じ動作をすることができません。
どのようにすれば、Deleteキーの入力感知とキャンセルが出来るでしょうか。


<追加の質問>
WndProcで、ウィンドウスメッセージのWM_CLEARって感知できないんですかね?
■No30232に返信(DepDoriさんの記事)

KeyDownで処理するとか
TextChangedで再帰を抑えて処理するとか
■No30232に返信(DepDoriさんの記事)
> ttp://jeanne.wankuma.com/tips/vb.net/textbox/permitchars.html

これは 1.1 時代の頃に書いたものですので、2.0 以降のそれに比べてあらゆる面でよろしくない方法です。
このような記事をそのまま放置していて大変申し訳なく思います。

> ここで問題が発生しまして、
> 10.1 と入力されているとき、小数点のみを消すと 101 という入力できてはいけない数字が入ってしまいます。

小数部の位置を固定するなら、MaskedTextBox を使用した方が手軽でわかりやすいのではないでしょうか?
もしくは更新前の最終チェックに一任するという方法もあります。
どのみち最終チェックは必須ですし、実装もシンプルになります。

> どのようにすれば、Deleteキーの入力感知とキャンセルが出来るでしょうか。

単純に Delete キーを抑制するだけであれば、すでに回答されているとおり KeyDown など捕捉可能なイベントやメソッドを使って判定し、カレットの位置に応じて Handled プロパティを true にします。

> WndProcで、ウィンドウスメッセージのWM_CLEARって感知できないんですかね?

実際に WndProc メソッドで監視してみたらわかることではないでしょうか。
これも今では MessageFilter を使う方法にするのが望ましいかもしれません。
No30233ではDepDoriさんの質問に対し肯定的に回答しましたが、編集中のチェックだけならまだしも編集状態をキャンセルされてしまうのは使い勝手が悪くなる可能性があります。例えば『.』以降を全て削除するのにDeleteキーを連続押下することにより行おうと思ったときその操作が出来なくなってしまいます。編集をすべて完了してからチェックの方が良いかと思います。

Validatingによるチェックという方法もあります。

数値のみを許可するテキストボックスでそれ以外の文字を拒否するという使い方程度なら使い勝手は悪くならないと思います。

DOBON.NET | プログラミング道 | プログラミング掲示板