2009-03-05 10 views
7

TextBoxコントロール(または.NET 3.5に標準付属するもの)の入力を浮動小数点数に制限する最もエレガントな方法は何ですか?C#のTextBoxに入力制限を実装する最良の方法は何ですか?

現在、私はTextBoxを継承し、OnKeyPressを上書きして自分自身を大げさにやっています。しかし、私は助けができませんが、私は車輪を再発明しているのだろうかと思う。

答えて

13

あなたが提案したルートを下る場合は、直面するであろう次の問題/コーナーケースを忘れてはいけない:

  • ユーザーがCtrlキー使用することができます - Vまたはシフト - を挿入して(無効な値を貼り付けてください)(2番目のものはちょっと厄介ですが)ユーザーはおそらくコントロールに有効な値を貼り付ける必要があります
  • ユーザーが右クリックして無効な値を貼り付けます
  • テキストボックスに独自のコンテキストメニューを与えることで直前の問題を解決しようとしても、ユーザーはコントロールの外で右クリックし、右ボタンを押しながらテキストボックスの上にドラッグしてなど、F4(そして、あなたならばそう、あなたがこれを中断します - あなたはAltキーのようなキーの組み合わせを無効にするべきではないんどのようなキー処理
  • デフォルトのコンテキスト・メニューにアクセスするために行く(および無効な値に貼り付けます)有効な数字ではないものはすべてSuppressKeyPressに設定してください)
  • ユーザーはおそらく部分的な値を入力する必要があります。"-.1e-2"よう
  • 数字は
  • 法的ユーザーと考えることができ、それらを罰し、あなたのテキストボックスなし "-."、彼らは "-.23"を入力し始めるとは)実行可能に数字のみが含まれている値を入力することもできますが、これは float
  • オーバーフローします最悪のもの:あなたが出荷した後にあなたのユーザーが見つけることができる他の神秘的なコーナーケース(!!)

道徳的な?あなたが提案していることをするのは非常に難しいことです。

あなたはおそらく、以下のいずれかの組み合わせをしたい:

  • は((マイクロソフトのように)構築されたすべてのコーナーケースを知っている人
  • TextChangedイベントに基本的な検証を行うことコントロールを使用し、
  • 実際に入力した値を使用するまで検証を保存します。
  • システムライブラリを使用して Parseのユーザーの価値を引き出します
+0

ガー、そう多くのエッジケースは世話をする。私はユーザーが嫌い...;) –

+0

@ecarF:No kidding;そのため、OPが求めているような堅牢な入力制御を実際に構築するのはそんなに苦しいものです。 –

+0

うわー、あなたがやっていることを(OKを押して)完了するのを待ってから、正規表現で値を押して、続けるか、MessageBoxを投げてください。 OnKeyPressをオーバーライドするよりもずっといいです。 – Karl

2

MaskedTextBoxコントロールをご覧ください。また、TextBoxBaseから継承し、おそらくあなたが構築している機能を備えています。

+0

迅速な対応をありがとう、マイク。私は実際に手作業に頼る前にMaskedTextBoxコントロールを調べましたが、浮動小数点数を使ってすぐに使いたいと思ったように動作させることができませんでした。おそらく私は何か愚かなことをしました... –

+0

MaskedTextBoxは無限(ユーザ定義)の文字数を許可していないようですので、ここで何か良いことをすることはできません。 –

0

ホイールはまだ(少なくとも.NET Frameworkでは)発明されていないと思います。私はCodeProjectなどにあなたが似ていることをしていると確信しているので、Googleの価値があるかもしれません。

重い持ち上げは信じられないほど悪くはありません。最初の一見より少し多くがあります。

あまりに単純化された例では、OnKeyPressを処理できます。Float.TryParseに新しい文字を追加してください。trueの場合は、キーを押したままにしてください。偽の場合はキャンセルしてください(e.Handled = true)。

ハード部分は、選択範囲を削除、切り取り、貼り付けする場合に発生します。 ...

+0

http://www.codeproject.com/KB/edit/RegexText.aspxそうするようです。 –

+0

ご意見ありがとうございますが、それほど簡単ではありません。ユーザーがキャレットの位置を変更するとどうなりますか?私が見る限り、あなたは盲目的に追加することはできません。 –

+0

リンクVirualBlackFoxをありがとう。私は間違いなく一見します。 –

0

それとも

void TextBox_KeyUp(object sender, KeyEventArgs e) 
{ 
    if(..) // your condition 
    { 
    e.SuppressKeyPress = false; 
    } 
    else 
    { 
    e.SuppressKeyPress = true; 
    } 
} 

または

void TextBox_KeyUp(object sender, KeyEventArgs e) 
{ 
    e.SuppressKeyPress = CheckInput(e.KeyValue); // where CheckInput is boolean method 
} 
を使用して一致をチェック - 彼らはちょうど(「」など、部分的に有効な入力を、あなたが受け入れることをお勧めします)を開始しているときに、他の事はあります
1

NumericUpDownの使用についてはどうですか?

0

私はmaskedTextBoxのValidatingTypeプロパティを発見:

maskedTextBox1.ValidatingType = typeof(System.Double); 

それは確かにそれが有効だかどうかを教えてくれありません。残念ながら、フォーカスが変化したとき(そして実際には何もしないとき)にのみ検証するように見えます。おそらくこれを使う方法があります。

+0

いつでも "ValidateText"メソッドを呼び出すことができます。ですから、フォーカスの変更の制限を回避するには、TextChangedのハンドラを設定し、if(maskedTextBox1.MaskCompleted){maskedTextBox1.ValidateText();と言ってください。 } – CJBrew

0

データ入力中に検証を行う必要がありますか、またはフォーカスが失われたときに入力された最終値を確認する余裕がありますか?

後者の場合は、ErrorProviderコントロールを使用して、入力が解決されるまで機能を制限することもできます。

+0

ありがとう、私はよく説明していたはずです。私はデータ入力中にユーザー入力を検証しています。 –

関連する問題