Numeric TextBox

后端 未结 13 1092
再見小時候
再見小時候 2020-12-03 20:01

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 past

相关标签:
13条回答
  • 2020-12-03 20:31

    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.

    0 讨论(0)
  • 2020-12-03 20:34

    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.
    0 讨论(0)
  • 2020-12-03 20:37

    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.

    0 讨论(0)
  • 2020-12-03 20:40

    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;
    }
    

    0 讨论(0)
  • 2020-12-03 20:44

    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.

    0 讨论(0)
  • 2020-12-03 20:44

    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.
        }
    
    0 讨论(0)
提交回复
热议问题