私はC#を初めて使用するMFCプログラマーであり、数値の入力と範囲の検証を可能にするシンプルなコントロールを探しています。
5 に答える
「NumericUpDown」コントロールを見てください。範囲の検証があり、入力は常に数値になり、それらの気の利いたインクリメント/デクリメントボタンがあります。
数値、整数、または実数のみを受け入れるコントロールを実装する必要がありました。私は、TextBoxコントロールの特殊化(読み取り:派生)としてコントロールを構築し、検証に入力コントロールと通常の式を使用します。範囲検証の追加は非常に簡単です。
これは、正規表現を作成するためのコードです。_numericSeparationは、小数点コンマ値として受け入れられる文字を含む文字列です(たとえば、「。」または「、」:$10.5010,50€</p>
private string ComputeRegexPattern()
{
StringBuilder builder = new StringBuilder();
if (this._forcePositives)
{
builder.Append("([+]|[-])?");
}
builder.Append(@"[\d]*((");
if (!this._useIntegers)
{
for (int i = 0; i < this._numericSeparator.Length; i++)
{
builder.Append("[").Append(this._numericSeparator[i]).Append("]");
if ((this._numericSeparator.Length > 0) && (i != (this._numericSeparator.Length - 1)))
{
builder.Append("|");
}
}
}
builder.Append(@")[\d]*)?");
return builder.ToString();
}
正規表現は、任意の数値(つまり、数字を含む任意の文字列)に一致し、数字の区切りとして1文字のみを使用し、文字列の先頭に「+」または「-」オプションの文字を指定します。正規表現を作成したら(コントロールをインスタンス化する場合)、OnValidatingメソッドをオーバーライドして値が正しいかどうかを確認します。CheckValidNumber()は、導入されたテキストに正規表現を適用するだけです。正規表現の一致が失敗した場合、指定されたエラー(ValidationErrorパブリックプロパティで設定)でエラープロバイダーをアクティブ化し、ValidationErrorイベントを発生させます。ここで、番号が必要な範囲内にあるかどうかを確認するための検証を行うことができます。
private bool CheckValidNumber()
{
if (Regex.Match(this.Text, this.RegexPattern).Value != this.Text)
{
this._errorProvider.SetError(this, this.ValidationError);
return false;
}
this._errorProvider.Clear();
return true;
}
protected override void OnValidating(CancelEventArgs e)
{
bool flag = this.CheckValidNumber();
if (!flag)
{
e.Cancel = true;
this.Text = "0";
}
base.OnValidating(e);
if (!flag)
{
this.ValidationFail(this, EventArgs.Empty);
}
}
私が言ったように、私はまた、ユーザーがOnKeyPressメソッドをオーバーライドする数字以外のデータをテキストボックスに入力できないようにします。
protected override void OnKeyPress(KeyPressEventArgs e)
{
if ((!char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar)) && (!this._numberSymbols.Contains(e.KeyChar.ToString()) && !this._numericSeparator.Contains(e.KeyChar.ToString())))
{
e.Handled = true;
}
if (this._numberSymbols.Contains(e.KeyChar.ToString()) && !this._forcePositives)
{
e.Handled = true;
}
if (this._numericSeparator.Contains(e.KeyChar.ToString()) && this._useIntegers)
{
e.Handled = true;
}
base.OnKeyPress(e);
}
エレガントなタッチ:ユーザーがキーを離すたびに番号が有効かどうかを確認するので、ユーザーは入力時にフィードバックを受け取ることができます。(ただし、ValidationFailイベントには注意する必要があることに注意してください;))
protected override void OnKeyUp(KeyEventArgs e)
{
this.CheckValidNumber();
base.OnKeyUp(e);
}
通常のテキストボックスとValidatorコントロールを使用して、入力を制御できます。
エラープロバイダーコントロールを使用して、テキストボックスを検証してみてください。int.TryParse()またはdouble.TryParse()を使用して、数値かどうかを確認してから、範囲を検証できます。
RequiredFieldValidator と CompareValidator の組み合わせを使用できます (演算子の DataTypeCheck に設定し、Type を Integer に設定します)。
必要に応じて通常のテキストボックスで取得できますが、それ以外の場合は上記の推奨事項が適切です。