0

2つの方法で制限しようとしているテキストボックスがあります。

1-数値のみを許可し、小数は許可しません

2-=35未満の数値のみを受け入れたい

これを処理するために、次のイベントがあります。

private void TextBoxWorkflowCountPreviewTextInput(object sender, TextCompositionEventArgs e)
{
    if (!IsNumeric(e.Text, NumberStyles.Integer)) e.Handled = true;
}

public bool IsNumeric(string val, NumberStyles numberStyle)
{
    double result;
    return double.TryParse(val, numberStyle, CultureInfo.CurrentCulture, out result);
}

private void TextBoxWorkflowCountTextChanged(object sender, TextChangedEventArgs e)
{
    if (!string.IsNullOrEmpty(textBoxWorkflowCount.Text) && Convert.ToInt32(textBoxWorkflowCount.Text) <= 35) e.Handled = true;
    else
    {
        MessageBox.Show("Must not be higher then 35");
        textBoxWorkflowCount.Text = "35";
    }
}

これは表面上は完全に正常に機能します-ユーザーがデータをテキストボックスに貼り付ける場合(避けられないように見える)、またはさらに不思議なことに、ユーザーが数値を入力してからバックスペースを押す(テキストボックスを再び空白にする)場合は、メッセージボックスに通知しますそれらの値が>35であることが表示されます(実際にはそうではありませんが)。私がしなければならない場合に私が生きることができる最初の問題-しかし、2番目はゲームを壊すことであり、それを解決しようとして30分後、私はどこにも行きません。ヘルプ!

4

2 に答える 2

1

数か月前、TextBox の動作 (Windows Phone 7.5 プラットフォーム) に関するブログ記事を書きました。これらの動作の 1 つは、入力テキストをフィルター処理できる TextBoxInputRegexFilterBehavior でした。したがって、ビヘイビアの仕組みに精通している場合は、このコードを使用できます

using System.Text.RegularExpressions;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Interactivity;

/// <summary>
/// UI behavior for <see cref="TextBox"/> to filter input text with special RegularExpression.
/// </summary>
public class TextBoxInputRegexFilterBehavior : Behavior<TextBox>
{
    private Regex regex;

    private string originalText;
    private int originalSelectionStart;
    private int originalSelectionLength;

    /// <summary>
    /// Gets or sets RegularExpression.
    /// </summary>
    public string RegularExpression 
    {
        get
        {
            return this.regex.ToString();
        } 

        set 
        {
            if (string.IsNullOrEmpty(value))
            {
                this.regex = null;
            }
            else
            {
                this.regex = new Regex(value);
            }
        } 
    }

    /// <inheritdoc/>
    protected override void OnAttached()
    {
        base.OnAttached();

        this.AssociatedObject.TextInputStart += this.AssociatedObjectTextInputStart;
        this.AssociatedObject.TextChanged += this.AssociatedObjectTextChanged;
    }

    /// <inheritdoc/>
    protected override void OnDetaching()
    {
        base.OnDetaching();

        this.AssociatedObject.TextInputStart -= this.AssociatedObjectTextInputStart;
        this.AssociatedObject.TextChanged -= this.AssociatedObjectTextChanged;
    }

    private void AssociatedObjectTextChanged(object sender, TextChangedEventArgs e)
    {
        if (this.originalText != null)
        {
            string text = this.originalText;
            this.originalText = null;
            this.AssociatedObject.Text = text;
            this.AssociatedObject.Select(this.originalSelectionStart, this.originalSelectionLength);
        }
    }

    private void AssociatedObjectTextInputStart(object sender, TextCompositionEventArgs e)
    {
        if (this.regex != null && e.Text != null && !(e.Text.Length == 1 && char.IsControl(e.Text[0])))
        {
            if (!this.regex.IsMatch(e.Text))
            {
                this.originalText = this.AssociatedObject.Text;
                this.originalSelectionStart = this.AssociatedObject.SelectionStart;
                this.originalSelectionLength = this.AssociatedObject.SelectionLength;
            }
        }
    }
}

したがって、この動作により、RegularExpression="(3[0-5])|([0-2]?[0-9])" のように、ユーザー入力をフィルタリングする単純な正規表現を記述できます。

于 2012-08-11T18:42:31.763 に答える
1

あなたのコードは最初の条件に失敗しています。

string.IsNullOrEmpty(textBoxWorkflowCount.Text) 

true と評価されるため、「else」にフォールスルーし、メッセージを表示します。

if (string.IsNullOrEmpty(textBoxWorkflowCount.Text) || Convert.ToInt32(textBoxWorkflowCount.Text) <= 35) e.Handled = true; 

トリックを行う必要があります

于 2012-08-11T16:15:34.150 に答える