質問
私は C# を初めて使用する MFC プログラマーで、数値入力と範囲検証を可能にするシンプルなコントロールを探しています。
解決
「NumericUpDown」コントロールを見てください。範囲検証があり、入力は常に数値であり、気の利いた増加/減少ボタンがあります。
他のヒント
数値、整数、実数のみを受け入れるコントロールを実装する必要がありました。私はコントロールを特殊化したものとして構築します (読み取り:TextBox コントロールから派生し、検証には入力コントロールと正規表現を使用します。範囲検証の追加は非常に簡単です。
これは正規表現を構築するためのコードです。_ numericseparationは、小数のコンマ値として受け入れられている文字列を持つ文字列です(たとえば、 '。または'、 ':$10.50 10.50ユーロ
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);
}
通常のテキストボックスとバリデーターコントロールを使用して入力を制御できます。
エラー プロバイダー コントロールを使用してテキスト ボックスを検証してみてください。int.TryParse() または double.TryParse() を使用して、数値かどうかを確認し、範囲を検証できます。
RequiredFieldValidator と CompareValidator を組み合わせて使用できます (演算子は DataTypeCheck に設定し、Type は Integer に設定します)。
必要に応じて通常のテキストボックスを使用して取得できますが、それ以外の場合は上記の推奨事項が適しています。