TextBox
コントロール(または.NET 3.5に標準付属するもの)の入力を浮動小数点数に制限する最もエレガントな方法は何ですか?C#のTextBoxに入力制限を実装する最良の方法は何ですか?
現在、私はTextBox
を継承し、OnKeyPress
を上書きして自分自身を大げさにやっています。しかし、私は助けができませんが、私は車輪を再発明しているのだろうかと思う。
TextBox
コントロール(または.NET 3.5に標準付属するもの)の入力を浮動小数点数に制限する最もエレガントな方法は何ですか?C#のTextBoxに入力制限を実装する最良の方法は何ですか?
現在、私はTextBox
を継承し、OnKeyPress
を上書きして自分自身を大げさにやっています。しかし、私は助けができませんが、私は車輪を再発明しているのだろうかと思う。
あなたが提案したルートを下る場合は、直面するであろう次の問題/コーナーケースを忘れてはいけない:
SuppressKeyPress
に設定してください)"-.1e-2"
よう"-."
、彼らは
"-.23"
を入力し始めるとは)実行可能に数字のみが含まれている値を入力することもできますが、これは
float
道徳的な?あなたが提案していることをするのは非常に難しいことです。
あなたはおそらく、以下のいずれかの組み合わせをしたい:
TextChanged
イベントに基本的な検証を行うことコントロールを使用し、Parse
のユーザーの価値を引き出します
MaskedTextBoxコントロールをご覧ください。また、TextBoxBaseから継承し、おそらくあなたが構築している機能を備えています。
迅速な対応をありがとう、マイク。私は実際に手作業に頼る前にMaskedTextBoxコントロールを調べましたが、浮動小数点数を使ってすぐに使いたいと思ったように動作させることができませんでした。おそらく私は何か愚かなことをしました... –
MaskedTextBoxは無限(ユーザ定義)の文字数を許可していないようですので、ここで何か良いことをすることはできません。 –
ホイールはまだ(少なくとも.NET Frameworkでは)発明されていないと思います。私はCodeProjectなどにあなたが似ていることをしていると確信しているので、Googleの価値があるかもしれません。
重い持ち上げは信じられないほど悪くはありません。最初の一見より少し多くがあります。
あまりに単純化された例では、OnKeyPress
を処理できます。Float.TryParse
に新しい文字を追加してください。trueの場合は、キーを押したままにしてください。偽の場合はキャンセルしてください(e.Handled = true
)。
ハード部分は、選択範囲を削除、切り取り、貼り付けする場合に発生します。 ...
http://www.codeproject.com/KB/edit/RegexText.aspxそうするようです。 –
ご意見ありがとうございますが、それほど簡単ではありません。ユーザーがキャレットの位置を変更するとどうなりますか?私が見る限り、あなたは盲目的に追加することはできません。 –
リンクVirualBlackFoxをありがとう。私は間違いなく一見します。 –
それとも
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
}
を使用して一致をチェック - 彼らはちょうど(「」など、部分的に有効な入力を、あなたが受け入れることをお勧めします)を開始しているときに、他の事はあります
NumericUpDownの使用についてはどうですか?
私はmaskedTextBoxのValidatingTypeプロパティを発見:
maskedTextBox1.ValidatingType = typeof(System.Double);
それは確かにそれが有効だかどうかを教えてくれありません。残念ながら、フォーカスが変化したとき(そして実際には何もしないとき)にのみ検証するように見えます。おそらくこれを使う方法があります。
いつでも "ValidateText"メソッドを呼び出すことができます。ですから、フォーカスの変更の制限を回避するには、TextChangedのハンドラを設定し、if(maskedTextBox1.MaskCompleted){maskedTextBox1.ValidateText();と言ってください。 } – CJBrew
データ入力中に検証を行う必要がありますか、またはフォーカスが失われたときに入力された最終値を確認する余裕がありますか?
後者の場合は、ErrorProviderコントロールを使用して、入力が解決されるまで機能を制限することもできます。
ありがとう、私はよく説明していたはずです。私はデータ入力中にユーザー入力を検証しています。 –
ガー、そう多くのエッジケースは世話をする。私はユーザーが嫌い...;) –
@ecarF:No kidding;そのため、OPが求めているような堅牢な入力制御を実際に構築するのはそんなに苦しいものです。 –
うわー、あなたがやっていることを(OKを押して)完了するのを待ってから、正規表現で値を押して、続けるか、MessageBoxを投げてください。 OnKeyPressをオーバーライドするよりもずっといいです。 – Karl