- - PR -
テキストボックスの入力制限をするには? (Windows.Forms)
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-05-09 11:45
Windows フォームアプリケーション(C#)で、入力値を制限できるテキストボックスを作成するには、どうしたら良いでしょうか? たとえば、数値のみの入力に制限されたテキストボックスなどです。(実際にはもっと複雑な入力制限のロジックがあります。)
・KeyDown を処理する方法だとクリップボードからのペーストに対応できない。 ・TextChanged は発生時点で Text が変更されているので手遅れ。 ・MaskedTextBox で対応できるような簡単な入力制限ではない。 Java (Swing) では DocumentFilter というクラスがあり、これを自分で定義して insertString, remove, replace メソッドをオーバーロードすることで入力制限をおこなうことができました。これらのメソッドには int offset, int length, String text などが渡されて、いまからドキュメント(テキスト)の何桁目に、どのような文字列が{挿入、削除、置換}されようとしているのか分かるようになっていました。(ここで、数字かどうかを見て挿入をキャンセルできました。) この DocumentFilter は、キーボード入力だけでなくクリップボードからのペーストなどドキュメントの変更がおこなわれようとしているときに働くので、とても容易に入力値の制限をおこなうことができたのです。 Windows フォームアプリケーション(C#)で、このようなことを実現するにはどうしたら良いでしょうか? | ||||||||||||
|
投稿日時: 2008-05-09 12:13
C#+入力できないようにする+TextBox
で検索。 | ||||||||||||
|
投稿日時: 2008-05-09 12:38
もう少し具体的なキーワードでヒントをいただけませんか?
提示していただいたキーワードを google で検索して、上位のいくつかの内容を見てみましたが、うまい解決策はないように思えました。 ・KeyPressイベントによる方法 → ペーストに対応できない。 ・WM_PEASTを無視する方法 → ペーストを禁止したいわけではない。 ・NumericUpDownコントロールを使う方法 → 数値以外の入力検査に対応できない。 ・CreateParamsをオーバーライドする方法 → Windowsが提供するコントロールとして振舞わせるだけで、独自の入力検査に対応できない。 私の調べ方が足りないようでしたら、すみません。 | ||||||||||||
|
投稿日時: 2008-05-09 13:01
検索結果のページを熟読されてはいかがでしょう? ぶさいくろうさんの提示のキーワードで検索すると1件目に どぼんさんのところの下記のURLが引っかかります。 http://dobon.net/vb/dotnet/control/numerictextbox.html キー入力にもペーストへの対応(無視するのではない方法)も方法が記載されていますよ。 この例では数字のみに制限するチェックですが、 他の文字での制限にも応用できるでしょう。 <訂正内容> 少し誤解を与えそうな文面があったので訂正しました。 ・調べ方が足りないのでは? →検索結果のページを熟読されてはいかがでしょう? ・ペーストへの対応 →ペーストへの対応(無視するのではない方法) </訂正内容> [ メッセージ編集済み 編集者: よねKEN 編集日時 2008-05-09 14:45 ] | ||||||||||||
|
投稿日時: 2008-05-09 13:06
ぶさいくろうさんが示された検索条件で、↓のサイトに辿り着きました。
基本的な考え方はこの通りでよいのではないかと思います。 http://jeanne.wankuma.com/tips/csharp/textbox/permitchars.html 個人的には、MaskedTextBoxでも扱いきれない複雑な条件を入力時に制御する、 というのはあまりやりたくありませんが…。 | ||||||||||||
|
投稿日時: 2008-05-09 14:04
よねKENさん、rainさん
まさに、それらのページで説明されている方法に対して、意図を満足しないとおっしゃっているように思います。 読み込みが足りないor勘違いが混ざっているとは思いますけど。 | ||||||||||||
|
投稿日時: 2008-05-09 15:22
リンクまで示してもらって、ありがとうございます。もう一度読み直してみたのですが、やはり分かりませんでした。教えて君で申し訳ないのですが、そのページ内を検索するためのキーワードを教えてもらうことはできませんか? そこまで質問者を甘やかすつもりはない、ということであれば残念ですが諦めます。
やはりそうなりますか…。 .NET でも、Windows メッセージという逃げ手を用意しているだけで、結局は Visual Studio 6.0 までと同じように Windows アプリケーションプログラミングをしなければ、このような細かい要求は満たせないということですね。 .NET アプリケーションプログラミングとして、ウィンドウメッセージを意識しない、もっとスマートな方法があるかと期待しましたが、諦めることにします。 どうもありがとうございました。 | ||||||||||||
|
投稿日時: 2008-05-09 15:50
先の投稿で未記入さんは以下のように書かれています。
この構成は私がURLで示したどぼんさんのところの構成ですから、 ここを読まれていると思います。 > ・WM_PEASTを無視する方法 → ペーストを禁止したいわけではない。 と書かれていますが、そこに乗っているサンプルコードは、 ペーストを禁止しているのではなく、数字が含まれているペーストのみを禁止しています。 ここが該当箇所です。 方法論として、rainさんのご提示にあるじゃんぬねっとさんのサイトの方法と 同じでWndProcをオーバーライドする方法です。 |