Numeric TextBox

后端 未结 13 1094
再見小時候
再見小時候 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: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.
        }
    

提交回复
热议问题