Numeric TextBox

2020-01-29 13:32发布

问题:

Im new to programming and I dont know very much about but I'm making a calculator, and i want to use a textbox that only acepts numbers and decimals, and when the user paste text from the clipboard the textbox deletes any literal characters, like the MS calc.

Please take the time to explain each part so I can learn or write it and tell me what to search.

Thanks

EDIT: I'll make it more specific:

How can I make a numeric textbox in C#? I've used the masked textbox but it wont take decimals.

I've read things about overloading the OnKeyPress method so it will correct any wrong characters but I dont know to do it.

回答1:

The easiest way :)

on Keypress event on your textbox


if ((e.KeyChar <= 57 && e.KeyChar >= 48) || e.KeyChar == 13 || e.KeyChar == 8)
{
}
else
{
     e.Handled = true;
}



回答2:

Add an event handler for the textbox you want to be numeric only, and add the following code:

private void textBoxNumbersOnly_KeyPress(object sender, KeyPressEventArgs e)
{
   if (Char.IsDigit(e.KeyChar) || e.KeyChar == '\b')
   {
      e.Handled = false;
   }
   else
   {
      e.Handled = true;
   }
}

This allows for numbers 0 to 9, and also backspaces (useful IMHO). Allow through the '.' character if you want to support decimals



回答3:

If you look closely, In Windows Calculator, the numbers are shown in a label not a textbox (It does not receive focus). The window receives keyboard events.

So look at KeyPressed and KeyDown events on the form.



回答4:

There is a control in the framework which is specially made for numeric input : the NumericUpDown control. It also manages decimal values.



回答5:

        if ("1234567890".IndexOf(e.KeyChar.ToString()) > 0)
        {
            e.Handled = false;
        }
        else
        {
            e.Handled = true;
        }


回答6:

Research the MaskedTextBox.

The question is a little broad to explain everything. Try to focus the question if you want specifics because you're asking for a lot of the community to "explain each part." If you ask a few specific questions (and exclude the "please the the time to explain..."), you'll get better responses.



回答7:

As far as I am aware there's nothing native in the .NET framework (2.0 at least) to do this. Your options would be:

  1. Create a custom control which inherits from the textbox control and only allows numeric input. This has the advantage that the control can be reused.
  2. Handle the KeyPress event and check the charCode to only allow numeric keystrokes. This is easier but much less reusable.


回答8:

i would probably use a regular expression to screen out non-numerics.

pseudo code:

for (each item in the input string) {
   if (!match(some regular expression, item)) {
        toss it out
   } else {
        add item to text box or whatever you were going to do with it
   }

}


回答9:

here how to do this in vb.net

Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
    Dim reg As New System.Text.RegularExpressions.Regex("[^0-9_ ]")
    TextBox1.Text = reg.Replace(TextBox1.Text, "")
End Sub

just fix the regex for your specific needs



回答10:

You could use a plain textbox or label as the calculator display and just make sure the value (a string?) is always a number. For instance, you could keep a double and convert it to a string when you wish to display it.



回答11:

useful for decimal numeric entry but has some bugs if (rightclick and paste) the other text. :D

 private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        string original = (sender as TextBox).Text;
        if (!char.IsDigit(e.KeyChar))
        {
            e.Handled = true;
        }
        if (e.KeyChar == '.')
        {
            if (original.Contains('.'))
                e.Handled = true;
            else if (!(original.Contains('.')))
                e.Handled = false;

        }
        else if (char.IsDigit(e.KeyChar)||e.KeyChar=='\b')
        {
            e.Handled = false;
        }

    }


回答12:

Here's a custom control I made based off mahasen's answer. Put it in it's own class file and fix the namespace to whatever you want. Once you rebuild your solution it should show up as a new control in your Toolbox menu tab that you can drag/drop onto a Form.

using System;
using System.Linq;
using System.Windows.Forms;

namespace MyApp.GUI
{
    public class FilteredTextBox : TextBox
    {
        // Fields
        private char[] m_validCharacters;
        private string m_filter;
        private event EventHandler m_maxLength;

        // Properties
        public string Filter
        {
            get
            {
                return m_filter;
            }
            set
            {
                m_filter = value;
                m_validCharacters = value.ToCharArray();
            }
        }

        // Constructor
        public FilteredTextBox()
        {
            m_filter = "";
            this.KeyPress += Validate_Char_OnKeyPress;
            this.TextChanged += Check_Text_Length_OnTextChanged;
        }

        // Event Hooks
        public event EventHandler TextBoxFull
        {
            add { m_maxLength += value; }
            remove { m_maxLength -= value; }
        }

        // Methods
        void Validate_Char_OnKeyPress(object sender, KeyPressEventArgs e)
        {
            if (m_validCharacters.Contains(e.KeyChar) || e.KeyChar == '\b')
                e.Handled = false;
            else
                e.Handled = true;
        }
        void Check_Text_Length_OnTextChanged(object sender, EventArgs e)
        {
            if (this.TextLength == this.MaxLength)
            {
                var Handle = m_maxLength;
                if (Handle != null)
                    Handle(this, EventArgs.Empty);
            }
        }
    }
}

and just as a bonus I wanted it to auto-tab to another box after I entered 3 characters so I set the box's max length to 3 and in the Form code I hooked that TextBoxFull event and focused on the box beside it. This was to chain 4 filtered boxes together to enter an IP address. Form code for the first two boxes is below...

    private bool ValidateAddressChunk(string p_text)
    {
        byte AddressChunk = new byte();
        return byte.TryParse(p_text, out AddressChunk);
    }
    private void filteredTextBox1_TextBoxFull(object sender, EventArgs e)
    {
        var Filtered_Text_Box = (FilteredTextBox)sender;

        if (!ValidateAddressChunk(Filtered_Text_Box.Text))
            filteredTextBox1.Text = "255";
        else
            filteredTextBox2.Focus();
    }
    private void filteredTextBox2_TextBoxFull(object sender, EventArgs e)
    {
        var Filtered_Text_Box = (FilteredTextBox)sender;

        if (!ValidateAddressChunk(Filtered_Text_Box.Text))
            filteredTextBox2.Text = "255";
        // etc.
    }


回答13:

Being a novice you might be better off investing in a good third party toolkit. Radcontrols from Telerik for instance has a numeric textbox that will accomplish what you are looking for.