Как сделать текстовое поле, которое принимает только цифры?

У меня была та же проблема, что и у этого, и натолкнулся на это решение изменения .cs, сгенерированного xsd.exe. Хотя это действительно сработало, мне было неудобно изменять сгенерированный код, так как мне нужно было бы это делать, когда я восстанавливал классы. Это также привело к некоторому неудобному коду, который должен был протестировать и передать в XmlNode [] для элементов mailto.

Моим решением было переосмыслить xsd. Я отбросил использование смешанного типа и по существу определил свой собственный смешанный тип.

У меня было это

XML: <text>some text <mailto>me@email.com</mailto>some more text</text>

<xs:complexType name="text" mixed="true">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="unbounded" name="mailto" type="xs:string" />
    </xs:sequence>
  </xs:complexType>

и изменено на

XML: <mytext><text>some text </text><mailto>me@email.com</mailto><text>some more text</text></mytext>

<xs:complexType name="mytext">
    <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="text">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="xs:string" />
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
        <xs:element name="mailto">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="xs:string" />
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>

Мой сгенерированный код теперь дает мне класс myText:

public partial class myText{

    private object[] itemsField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("mailto", typeof(myTextTextMailto))]
    [System.Xml.Serialization.XmlElementAttribute("text", typeof(myTextText))]
    public object[] Items {
        get {
            return this.itemsField;
        }
        set {
            this.itemsField = value;
        }
    }
}

порядок элементов теперь сохраняется в сериализации / десериализации, но мне нужно проверить / cast to / program на типы myTextTextMailto и myTextText.

Просто подумал, что я брошу это как альтернативный подход, который работал для меня.

542
задан Mykroft 20 January 2009 в 21:55
поделиться

8 ответов

Две опции:

  1. Использование NumericUpDown вместо этого. NumericUpDown делает фильтрацию для Вас, которая хороша. Конечно, это также дает Вашим пользователям способность поразить стрелки вверх и вниз в клавиатуру, чтобы увеличить и постепенно уменьшить текущее значение.

  2. Дескриптор соответствующие события клавиатуры для предотвращения чего-либо кроме числового входа. Я имел успех с этим два обработчика событий на стандартном TextBox:

    private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) &&
            (e.KeyChar != '.'))
        {
                e.Handled = true;
        }
    
        // only allow one decimal point
        if ((e.KeyChar == '.') && ((sender as TextBox).Text.IndexOf('.') > -1))
        {
            e.Handled = true;
        }
    }
    

можно удалить проверку на '.' (и последующая проверка на больше чем один '.'), если TextBox не должен позволять десятичные разряды. Вы могли также добавить проверку на '-', если Ваш TextBox должен позволить отрицательные величины.

, Если Вы хотите ограничить пользователя для количества цифры, используйте: textBox1.MaxLength = 2; // this will allow the user to enter only 2 digits

739
ответ дан Bitterblue 20 January 2009 в 21:55
поделиться

Я принимаю от контекста и тегов, Вы использовали это, Вы пишете.NET приложение C#. В этом случае можно подписаться на измененное событие текста, и проверять каждое нажатие клавиши.

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        if (System.Text.RegularExpressions.Regex.IsMatch(textBox1.Text, "[^0-9]"))
        {
            MessageBox.Show("Please enter only numbers.");
            textBox1.Text = textBox1.Text.Remove(textBox1.Text.Length - 1);
        }
    }
48
ответ дан Primož Kralj 20 January 2009 в 21:55
поделиться

Попробуйте MaskedTextBox. Это берет простой формат маски, таким образом, можно ограничить вход числами или датами или что бы то ни было.

12
ответ дан Andrew Kennan 20 January 2009 в 21:55
поделиться
  • 1
    @Pete проверьте использование console.log () для ошибки jQuery. – Dhaval Bharadva 27 December 2013 в 06:06

Вы могли использовать событие TextChanged / Keypress, использовать regex, чтобы отфильтровать на числах и принять некоторые меры.

2
ответ дан Perpetualcoder 20 January 2009 в 21:55
поделиться

И просто потому что это всегда - больше забавы сделать материал в одной строке...

 private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        e.Handled = !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar);
    }

ПРИМЕЧАНИЕ: Это НЕ препятствует пользователю Копия / Вставка в это текстовое поле. Это не сбой безопасный способ санировать Ваши данные.

131
ответ дан BFree 20 January 2009 в 21:55
поделиться
  • 1
    Взгляд через php; если это работает со стандартным представлением действия формы, это должно работать с сериализировать jQuery? или я должен буду сделать некоторые модификации для несериализирования/обрабатывания массива данных формы? – DVCITIS 27 December 2013 в 06:39

Смотрите на Входная обработка в WinForm

, я отправил свое решение, которое использует события ProcessCmdKey и OnKeyPress на текстовом поле. Комментарии показывают Вам, как использовать Regex, чтобы проверить нажатие клавиши и блокировать/позволять соответственно.

2
ответ дан Community 20 January 2009 в 21:55
поделиться
  • 1
    @JoshuaMerriman Да, но это doesn' t означают, что необходимо сделать это принятым ответом. Примите ответ, который помог Вы , Вы корректны, этот ответ поможет людям, которые хотят реализовать это решение собой, но этим doesn' t означают, что мы должны способствовать перестраиванию колеса. Это не серьезное основание к непринятому ответ, который Вы на самом деле использовали. – jamylak 22 May 2013 в 08:47

Я сделал что-то для этого на CodePlex.

Это работает путем прерывания события TextChanged. Если результатом будет большое количество, то он будет сохранен. Если это будет что-то не так, последнее хорошее значение будет восстановлено. Источник является немного слишком большим для публикации здесь, но вот ссылка на класс , который обрабатывает ядро этой логики.

4
ответ дан GvS 20 January 2009 в 21:55
поделиться
  • 1
    Ой, я не принимал последний ответ? У меня создалось впечатление, что я мог принять несколько ответов. Я был неправ, все же. Ужасно извините! – Joshua Merriman 5 June 2013 в 00:00

Рабочее решение для WPF & простое TextChangedEventArgs.

private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
    var TextBox = (sender as TextBox);

    // if not a numeric value, remove news characters
    if (Regex.IsMatch(TextBox.Text, "[^0-9]"))
    {
        foreach (TextChange Change in e.Changes)
        {
            TextBox.Text = TextBox.Text.Remove(Change.Offset, Change.AddedLength);

            TextBox.CaretIndex = Change.Offset;
        }
    }
}
0
ответ дан 22 November 2019 в 22:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: