Числовой TextBox - PullRequest
       34

Числовой TextBox

3 голосов
/ 03 февраля 2009

Я новичок в программировании, и я не очень разбираюсь в этом, но я делаю калькулятор, и я хочу использовать текстовое поле, содержащее только цифры и десятичные числа, и когда пользователь вставляет текст из буфера обмена, текстовое поле удаляет любые литералы символы, такие как MS calc.

Пожалуйста, уделите время объяснению каждой части, чтобы я мог выучить или написать ее и сказать, что искать.

Спасибо

РЕДАКТИРОВАТЬ: я сделаю это более конкретно:

Как создать числовое текстовое поле в C #? Я использовал замаскированное текстовое поле, но оно не будет принимать десятичные дроби.

Я читал о перегрузке метода OnKeyPress, поэтому он будет исправлять любые неправильные символы, но я не знаю, как это сделать.

Ответы [ 13 ]

11 голосов
/ 04 мая 2009

Добавьте обработчик событий для текстового поля, для которого вы хотите использовать только цифры, и добавьте следующий код:

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

Это допускает числа от 0 до 9, а также пробелы (полезно ИМХО). Разрешить через "." символ, если вы хотите поддержать десятичные числа

7 голосов
/ 03 февраля 2009

Если присмотреться, в калькуляторе Windows числа отображаются в метке, а не в текстовом поле (оно не получает фокус). Окно получает события клавиатуры.

Посмотрите на события KeyPressed и KeyDown в форме.

4 голосов
/ 03 февраля 2009

Самый простой способ:)

при событии нажатия клавиши в вашем текстовом поле


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

2 голосов
/ 04 февраля 2009

В платформе есть элемент управления, специально созданный для ввода чисел: элемент управления NumericUpDown Он также управляет десятичными значениями.

1 голос
/ 31 августа 2010
        if ("1234567890".IndexOf(e.KeyChar.ToString()) > 0)
        {
            e.Handled = false;
        }
        else
        {
            e.Handled = true;
        }
0 голосов
/ 07 июня 2013

Вот пользовательский элемент управления, который я сделал на основе ответа mahasen . Поместите его в свой собственный файл класса и зафиксируйте пространство имен по своему усмотрению. Как только вы перестроите свое решение, оно должно появиться как новый элемент управления на вкладке меню панели инструментов, который вы можете перетаскивать на 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);
            }
        }
    }
}

и в качестве бонуса я хотел, чтобы он автоматически переходил в другое поле после ввода 3 символов, поэтому я установил максимальную длину блока на 3, а в коде Form я перехватил это событие TextBoxFull и сосредоточился на поле рядом Это. Это должно было соединить 4 отфильтрованных поля вместе, чтобы ввести IP-адрес. Код формы для первых двух полей ниже ...

    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 голосов
/ 05 ноября 2012

полезно для десятичной числовой записи, но имеет некоторые ошибки, если (щелкнуть правой кнопкой мыши и вставить) другой текст. : 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;
        }

    }
0 голосов
/ 03 февраля 2009

Будучи новичком, вам лучше инвестировать в хороший сторонний инструментарий. Например, Radcontrols от Telerik имеет числовое текстовое поле, которое выполнит то, что вы ищете.

0 голосов
/ 03 февраля 2009

Вы можете использовать обычное текстовое поле или метку в качестве дисплея калькулятора и просто убедиться, что значение (строка?) Всегда является числом. Например, вы можете сохранить значение типа double и преобразовать его в строку, если хотите отобразить ее.

0 голосов
/ 03 февраля 2009

Я бы, вероятно, использовал бы регулярное выражение, чтобы отсеивать нечисловые значения.

псевдокод:

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
   }

}
...