- PR -

テキストボックスの入力制限をするには? (Windows.Forms)

投稿者投稿内容
未記入
大ベテラン
会議室デビュー日: 2008/02/07
投稿数: 115
投稿日時: 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#)で、このようなことを実現するにはどうしたら良いでしょうか?
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2008-05-09 12:13
C#+入力できないようにする+TextBox

で検索。
未記入
大ベテラン
会議室デビュー日: 2008/02/07
投稿数: 115
投稿日時: 2008-05-09 12:38
もう少し具体的なキーワードでヒントをいただけませんか?

提示していただいたキーワードを google で検索して、上位のいくつかの内容を見てみましたが、うまい解決策はないように思えました。

・KeyPressイベントによる方法 → ペーストに対応できない。

・WM_PEASTを無視する方法 → ペーストを禁止したいわけではない。

・NumericUpDownコントロールを使う方法 → 数値以外の入力検査に対応できない。

・CreateParamsをオーバーライドする方法 → Windowsが提供するコントロールとして振舞わせるだけで、独自の入力検査に対応できない。

私の調べ方が足りないようでしたら、すみません。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2008-05-09 13:01
引用:

未記入さんの書き込み (2008-05-09 12:38) より:
もう少し具体的なキーワードでヒントをいただけませんか?

提示していただいたキーワードを google で検索して、上位のいくつかの内容を見てみましたが、うまい解決策はないように思えました。



検索結果のページを熟読されてはいかがでしょう?
ぶさいくろうさんの提示のキーワードで検索すると1件目に
どぼんさんのところの下記のURLが引っかかります。
http://dobon.net/vb/dotnet/control/numerictextbox.html

キー入力にもペーストへの対応(無視するのではない方法)も方法が記載されていますよ。
この例では数字のみに制限するチェックですが、
他の文字での制限にも応用できるでしょう。

<訂正内容>
少し誤解を与えそうな文面があったので訂正しました。

・調べ方が足りないのでは?
→検索結果のページを熟読されてはいかがでしょう?
・ペーストへの対応
→ペーストへの対応(無視するのではない方法)
</訂正内容>

[ メッセージ編集済み 編集者: よねKEN 編集日時 2008-05-09 14:45 ]
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-05-09 13:06
ぶさいくろうさんが示された検索条件で、↓のサイトに辿り着きました。
基本的な考え方はこの通りでよいのではないかと思います。
http://jeanne.wankuma.com/tips/csharp/textbox/permitchars.html

個人的には、MaskedTextBoxでも扱いきれない複雑な条件を入力時に制御する、
というのはあまりやりたくありませんが…。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-05-09 14:04
よねKENさん、rainさん

まさに、それらのページで説明されている方法に対して、意図を満足しないとおっしゃっているように思います。
読み込みが足りないor勘違いが混ざっているとは思いますけど。
未記入
大ベテラン
会議室デビュー日: 2008/02/07
投稿数: 115
投稿日時: 2008-05-09 15:22
引用:

検索結果のページを熟読されてはいかがでしょう?
ペーストへの対応(無視するのではない方法)も方法が記載されていますよ。


リンクまで示してもらって、ありがとうございます。もう一度読み直してみたのですが、やはり分かりませんでした。教えて君で申し訳ないのですが、そのページ内を検索するためのキーワードを教えてもらうことはできませんか?

そこまで質問者を甘やかすつもりはない、ということであれば残念ですが諦めます。

引用:

ぶさいくろうさんが示された検索条件で、↓のサイトに辿り着きました。
基本的な考え方はこの通りでよいのではないかと思います。
http://jeanne.wankuma.com/tips/csharp/textbox/permitchars.html



やはりそうなりますか…。

.NET でも、Windows メッセージという逃げ手を用意しているだけで、結局は Visual Studio 6.0 までと同じように Windows アプリケーションプログラミングをしなければ、このような細かい要求は満たせないということですね。

.NET アプリケーションプログラミングとして、ウィンドウメッセージを意識しない、もっとスマートな方法があるかと期待しましたが、諦めることにします。

どうもありがとうございました。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2008-05-09 15:50
引用:

未記入さんの書き込み (2008-05-09 15:22) より:
引用:

検索結果のページを熟読されてはいかがでしょう?
ペーストへの対応(無視するのではない方法)も方法が記載されていますよ。


リンクまで示してもらって、ありがとうございます。もう一度読み直してみたのですが、やはり分かりませんでした。教えて君で申し訳ないのですが、そのページ内を検索するためのキーワードを教えてもらうことはできませんか?



先の投稿で未記入さんは以下のように書かれています。
引用:

未記入さんの書き込み (2008-05-09 12:38) より:
・KeyPressイベントによる方法 → ペーストに対応できない。

・WM_PEASTを無視する方法 → ペーストを禁止したいわけではない。

・NumericUpDownコントロールを使う方法 → 数値以外の入力検査に対応できない。

・CreateParamsをオーバーライドする方法 → Windowsが提供するコントロールとして振舞わせるだけで、独自の入力検査に対応できない。



この構成は私がURLで示したどぼんさんのところの構成ですから、
ここを読まれていると思います。

> ・WM_PEASTを無視する方法 → ペーストを禁止したいわけではない。

と書かれていますが、そこに乗っているサンプルコードは、
ペーストを禁止しているのではなく、数字が含まれているペーストのみを禁止しています。
ここが該当箇所です。

方法論として、rainさんのご提示にあるじゃんぬねっとさんのサイトの方法と
同じでWndProcをオーバーライドする方法です。

スキルアップ/キャリアアップ(JOB@IT)