4

Financial Winformsアプリケーションを実行していますが、コントロールに問題があります。

私の顧客は、あらゆる場所(価格、割引など)に小数値を挿入する必要があり、検証の繰り返しを避けたいと考えています。

そこで、フォーカスとマスクの長さが合わない場合は、自分のニーズに合うMaskedTextBox(「€00000.00」のようなマスクを使用)をすぐに試しました。

顧客がアプリに入力する数字の大きさを予測することはできません。

また、コンマに到達するためにすべてを00で開始することも期待できません。すべてがキーボードフレンドリーでなければなりません。

何かが足りないのでしょうか、それとも標準のWindowsフォームコントロールでこれを実現する方法がないのでしょうか(カスタムコントロールを作成する以外に)?

4

6 に答える 6

5

カスタムコントロールが必要になります。コントロールでValidatingイベントをトラップし、文字列入力を10進数として解析できるかどうかを確認するだけです。

于 2008-10-28T14:19:27.280 に答える
5

この2つのオーバーライドされたメソッドは私のためにそれを行いました(免責事項:このコードはまだ本番環境にありません。変更が必要になる場合があります)

    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        if (!char.IsNumber(e.KeyChar) & (Keys)e.KeyChar != Keys.Back 
            & e.KeyChar != '.')
        {
            e.Handled = true;
        }

        base.OnKeyPress(e);
    }

    private string currentText;

    protected override void OnTextChanged(EventArgs e)
    {
        if (this.Text.Length > 0)
        {
            float result;
            bool isNumeric = float.TryParse(this.Text, out result);

            if (isNumeric)
            {
                currentText = this.Text;
            }
            else
            {
                this.Text = currentText;
                this.Select(this.Text.Length, 0);
            }
        }
        base.OnTextChanged(e);
    }
于 2008-10-28T14:28:28.183 に答える
3

カスタム コントロールは必要ないと思います。検証イベント用に 10 進数の検証メソッドを記述し、検証が必要なすべての場所でそれを使用するだけです。NumberFormatInfoを含めることを忘れないでください。コンマと数値記号を処理します。

于 2008-10-28T14:24:49.360 に答える
1

MSDN: User Input Validation in Windows Forms

于 2008-10-28T14:22:26.543 に答える
0

数字と小数点記号のみを通す必要があり、二重の小数点記号は避けてください。おまけとして、これにより、開始 10 進数の前に 0 が自動的に追加されます。

public class DecimalBox : TextBox
{
    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        if (e.KeyChar == ',')
        {
            e.KeyChar = '.';
        }

        if (!char.IsNumber(e.KeyChar) && (Keys)e.KeyChar != Keys.Back && e.KeyChar != '.')
        {
            e.Handled = true;
        }

        if(e.KeyChar == '.' )
        {
            if (this.Text.Length == 0)
            {
                this.Text = "0.";
                this.SelectionStart = 2;
                e.Handled = true;
            }
            else if (this.Text.Contains("."))
            {
                e.Handled = true;
            }
        }

        base.OnKeyPress(e);
    }
}
于 2015-03-15T18:10:08.397 に答える
0

別のアプローチは、不要なものをブロックし、使い終わったらフォーマットすることです。

class DecimalTextBox : TextBox
{
    // Handle multiple decimals
    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        if (e.KeyChar == '.')
            if (this.Text.Contains('.'))
                e.Handled = true;

        base.OnKeyPress(e);
    }

    // Block non digits
    // I scrub characters here instead of handling in OnKeyPress so I can support keyboard events (ctrl + c/v/a)
    protected override void OnTextChanged(EventArgs e)
    {
        this.Text = System.Text.RegularExpressions.Regex.Replace(this.Text, "[^.0-9]", "");
        base.OnTextChanged(e);
    }

    // Apply our format when we're done
    protected override void OnLostFocus(EventArgs e)
    {
        if (!String.IsNullOrEmpty(this.Text))
            this.Text = string.Format("{0:N}", Convert.ToDouble(this.Text));

        base.OnLostFocus(e);
    }


}
于 2018-09-14T22:30:38.927 に答える