Только для чисел TextBox - PullRequest
       15

Только для чисел TextBox

1 голос
/ 25 декабря 2011

Я посмотрел повсюду, но кажется, что примеры, которые я видел, допускают только цифры 0-9

Я пишу программу теоремы Пифагора.Я хочу, чтобы телефон (Windows Phone 7) проверил, есть ли в текстовом поле ЛЮБОЙ альфа (AZ, az), символы (@,%) или что-либо, кроме числа.Если нет, то он продолжит вычисления.Я хочу проверить, чтобы в будущем не было ошибок.

Это в основном плохой псевдокод того, что я хочу, чтобы он делал

txtOne -> любая альфа? - Нет ->любые символы - Нет -> продолжить ...

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

Заранее спасибо!

Ответы [ 6 ]

9 голосов
/ 25 декабря 2011

Еще лучший способ убедиться, что ваше текстовое поле является числом, - это обработать событие KeyPress.Затем вы можете выбрать, какие символы вы хотите разрешить.В следующем примере мы запрещаем все символы, которые не являются цифрами:

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    // If the character is not a digit, don't let it show up in the textbox.
    if (!char.IsDigit(e.KeyChar))
        e.Handled = true;
}

Это гарантирует, что текст вашего текстового поля является числом, поскольку позволяет вводить только цифры.


Этоэто то, что я только что придумал, чтобы разрешить десятичные значения (и, видимо, клавишу возврата):

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (char.IsDigit(e.KeyChar))
    {
        return;
    }
    if (e.KeyChar == (char)Keys.Back)
    {
        return;
    }
    if (e.KeyChar == '.' && !textBox1.Text.Contains('.'))
    {
        return;
    }
    e.Handled = true;
} 
4 голосов
/ 25 декабря 2011

Есть несколько способов сделать это:

  1. Вы можете использовать TryParse() и проверить, не является ли возвращаемое значение ложным.

  2. Вы можете использовать Regex для подтверждения:

    Match match = Regex.Match(textBox.Text, @"^\d+$");
    if (match.Success) { ... }
    // or
    if (Regex.IsMatch(textBox.Text, @"^\d+$")) { ... }
    
2 голосов
/ 25 декабря 2011

Или вы можете просто дать им только цифровую клавиатуру. Есть несколько различных раскладок клавиатуры, которые вы можете использовать. Ссылка

Если вы хотите сделать больше, я использовал события KeyDown и KeyUp, чтобы проверить, что было введено, и обработать нажатие клавиши. Link

1 голос
/ 08 мая 2013

Вы можете определить область ввода текстового поля.

Пример:

<TextBox InputScope="Digits"></TextBox>
0 голосов
/ 24 ноября 2012
/// <summary>
/// A numeric-only textbox.
/// </summary>
public class NumericOnlyTextBox : TextBox
{
    #region Properties

    #region AllowDecimals

    /// <summary>
    /// Gets or sets a value indicating whether [allow decimals].
    /// </summary>
    /// <value>
    ///   <c>true</c> if [allow decimals]; otherwise, <c>false</c>.
    /// </value>
    public bool AllowDecimals
    {
        get { return (bool)GetValue(AllowDecimalsProperty); }
        set { SetValue(AllowDecimalsProperty, value); }
    }

    /// <summary>
    /// The allow decimals property
    /// </summary>
    public static readonly DependencyProperty AllowDecimalsProperty =
        DependencyProperty.Register("AllowDecimals", typeof(bool), 
        typeof(NumericOnlyTextBox), new UIPropertyMetadata(false));

    #endregion

    #region MaxValue

    /// <summary>
    /// Gets or sets the max value.
    /// </summary>
    /// <value>
    /// The max value.
    /// </value>
    public double? MaxValue
    {
        get { return (double?)GetValue(MaxValueProperty); }
        set { SetValue(MaxValueProperty, value); }
    }

    /// <summary>
    /// The max value property
    /// </summary>
    public static readonly DependencyProperty MaxValueProperty =
        DependencyProperty.Register("MaxValue", typeof(double?), 
        typeof(NumericOnlyTextBox), new UIPropertyMetadata(null));

    #endregion

    #region MinValue

    /// <summary>
    /// Gets or sets the min value.
    /// </summary>
    /// <value>
    /// The min value.
    /// </value>
    public double? MinValue
    {
        get { return (double?)GetValue(MinValueProperty); }
        set { SetValue(MinValueProperty, value); }
    }

    /// <summary>
    /// The min value property
    /// </summary>
    public static readonly DependencyProperty MinValueProperty =
        DependencyProperty.Register("MinValue", typeof(double?), 
        typeof(NumericOnlyTextBox), new UIPropertyMetadata(null));

    #endregion

    #endregion

    #region Contructors

    /// <summary>
    /// Initializes a new instance of the <see cref="NumericOnlyTextBox" /> class.
    /// </summary>
    public NumericOnlyTextBox()
    {
        this.PreviewTextInput += OnPreviewTextInput;        
    }

    #endregion

    #region Methods

    /// <summary>
    /// Numeric-Only text field.
    /// </summary>
    /// <param name="text">The text.</param>
    /// <returns></returns>
    public bool NumericOnlyCheck(string text)
    {
        // regex that matches disallowed text
        var regex = (AllowDecimals) ? new Regex("[^0-9.]+") : new Regex("[^0-9]+");
        return !regex.IsMatch(text);
    }

    #endregion

    #region Events

    /// <summary>
    /// Called when [preview text input].
    /// </summary>
    /// <param name="sender">The sender.</param>
    /// <param name="e">The <see cref="TextCompositionEventArgs" /> instance 
    /// containing the event data.</param>
    /// <exception cref="System.NotImplementedException"></exception>
    private void OnPreviewTextInput(object sender, TextCompositionEventArgs e)
    {
        // Check number
        if (this.NumericOnlyCheck(e.Text))
        {
            // Evaluate min value
            if (MinValue != null && Convert.ToDouble(this.Text + e.Text) < MinValue)
            {
                this.Text = MinValue.ToString();
                this.SelectionStart = this.Text.Length;
                e.Handled = true;
            }

            // Evaluate max value
            if (MaxValue != null && Convert.ToDouble(this.Text + e.Text) > MaxValue)
            {
                this.Text = MaxValue.ToString();
                this.SelectionStart = this.Text.Length;
                e.Handled = true;
            }
        }

        else
        {
            e.Handled = true;
        }
    }

    #endregion
}
0 голосов
/ 25 декабря 2011

Вы можете использовать TryParse и посмотреть, есть ли результат.

См. http://msdn.microsoft.com/en-us/library/system.int64.tryparse.aspx

Int64 output;
if (!Int64.TryParse(input, out output)
{
    ShowErrorMessage();
    return
}
Continue..
...