Windows Forms: NumericTextBox

Ab Werk bei Windows Forms gibt es leider keine numerische Textbox. Ich habe mich dabei ertappt, dass ich das in jedem Projekt neuprogrammiert habe. Heute soll damit Schluss sein: Nach einem kurzen Besuch bei der Suchmaschine meiner Wahl fand ich ein Snippet, das ich gleich etwas anpasste (und auch noch weiter anpassen muss):

public class NumericTextBox : TextBox
{
    bool allowSpace = false;
    private bool isInt;

    // Restricts the entry of characters to digits 
    // (including hex), the negative sign,
    // the decimal point, and editing keystrokes (backspace).
    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        base.OnKeyPress(e);

        NumberFormatInfo numberFormatInfo = System.Globalization.CultureInfo.CurrentCulture.NumberFormat;
        string decimalSeparator = numberFormatInfo.NumberDecimalSeparator;
        //string groupSeparator = numberFormatInfo.NumberGroupSeparator;
        string negativeSign = numberFormatInfo.NegativeSign;

        string keyInput = e.KeyChar.ToString();

        if (Char.IsDigit(e.KeyChar))
        {
            // Digits are OK
        }
        else if (keyInput.Equals(decimalSeparator) || // keyInput.Equals(groupSeparator) ||
            keyInput.Equals(negativeSign))
        {
            // Decimal separator is OK
        }
        else if (e.KeyChar == '\b')
        {
            // Backspace key is OK
        }
        //    else if ((ModifierKeys & (Keys.Control | Keys.Alt)) != 0)
        //    {
        //     // Let the edit control handle control and alt key combinations
        //    }
        else if (this.allowSpace && e.KeyChar == ' ')
        {

        }
        else
        {
            // Swallow this invalid key and beep
            e.Handled = true;
            //    MessageBeep();
        }
    }

    public int IntValue
    {
        get
        {
            return Int32.Parse(this.Text);
        }
    }

    public double DoubleValue
    {
        get
        {
            return double.Parse(this.Text);
        }
    }
    protected override void OnValidating(CancelEventArgs e)
    {
        base.OnValidating(e);
        try
        {
            if (!isInt)
                this.Text = Math.Round(double.Parse(this.Text), 2).ToString("F2");
            else
                this.Text = Math.Round(double.Parse(this.Text), 0).ToString();
        }
        catch
        {
            e.Cancel = true;
        }
    }
    public bool AllowSpace
    {
        set
        {
            this.allowSpace = value;
        }

        get
        {
            return this.allowSpace;
        }
    }
    public bool IsInt
    {
        set
        {
            this.isInt = value;
        }

        get
        {
            return this.isInt;
        }
    }
}

Vorhandene Textboxen in den „Designer.cs“-Files suchen und ersetzen. Fertig!

Der Vorschlag kommt übrigens von MS direkt. Man hätte es aber auch direkt in VS integrieren können …
http://msdn.microsoft.com/en-us/library/ms229644(v=vs.80).aspx

Cheers,
Ralf

Comments are closed.