3

ここで質問を調べたところ、テキストボックスに小数点が 1 つと先頭にマイナス記号が 1 つ付いた数値のみを受け入れるようにするための答えが見つかりました。

    if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && e.KeyChar != '.' && e.KeyChar != '-')
    {
        e.Handled = true;
    }

    // only allow one decimal point
    if (e.KeyChar == '.' && (sender as TextBox).Text.IndexOf('.') > -1)
    {
        e.Handled = true;
    }

    if (e.KeyChar == '-' && (sender as TextBox).Text.Length > 0)
    {
        e.Handled = true;
    }

ただし、1 つ問題があります。ユーザーが数字を入力したとします。

123455789764

そして、彼はその数が負であることに気づきます。彼は最初に戻ってマイナス記号を入力しようとしましたが、機能していないことがわかりました。ユーザーが入力した数値を削除し、負の数値を追加して数値を再入力する代わりに、この問題に対処する方法はありますか?

4

5 に答える 5

3

これを試して:

Regex reg = new Regex(@"^-?\d+[.]?\d*$");
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (char.IsControl(e.KeyChar)) return;
        if (!reg.IsMatch(textBox1.Text.Insert(textBox1.SelectionStart, e.KeyChar.ToString()) + "1")) e.Handled = true;
    }

keyboardP の提案については、数値以外の値を完全に防止するためにこのコードを追加しますTextBox.ShortcutsEnabled = false;。ユーザーが数値データをコピーして貼り付ける必要はないと思うので、試してみるべきだと思います。

    Regex reg = new Regex(@"^-?\d+[.]?\d*$");
    bool textChangedByKey;
    string lastText;
    private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (char.IsControl(e.KeyChar)) return;
        if (!reg.IsMatch(textBox1.Text.Insert(textBox1.SelectionStart, e.KeyChar.ToString()) + "1"))
        {
            e.Handled = true;
            return;
        }
        textChangedByKey = true;
    }
    private void textBox1_TextChanged(object sender, EventArgs e)
    {            
        if (!textChangedByKey)
        {
            if (!reg.IsMatch(textBox1.Text))
            {
                textBox1.Text = lastText;
                return;
            }                
        }
        else textChangedByKey = false;
        lastText = textBox1.Text;
    }

Undo()いくつかのリセットでメソッドを使用してみましSelectedTextたが、少し悪いです.上記の方法でも良い視覚効果が得られません.数値テキストボックスにテキストを貼り付けようとすると、テキストが変更され、有効な値に復元されます. .

于 2013-07-04T09:34:24.943 に答える
1
  1. すべてのキーストロークではなく、「OK」または「送信」ボタンがクリックされたときにのみ文字を評価する
  2. 正規表現を使用して、入力した文字だけでなく、テキスト全体の有効性を確認しますOR
  3. テキストをlongusingに解析し、呼び出しInt64.TryParseの結果を評価してみてください。bool
  4. 上記のすべてを読んだ後:単純にNumericUpDownコントロールを使用しないのはなぜですか?
于 2013-07-04T09:41:03.000 に答える
0

テキストボックスイベントに依存することは、問題に対するより良いアプローチだと思います。いずれにせよ、引き続き方法論を使用し、見出しの「-」の問題を説明するイベントで補完することができます。このコードは、最初の位置にない限り、テキスト ボックスからすべてのダッシュを削除します。

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        if (textBox1.Text.Trim().Length > 0)
        {
            if (textBox1.Text.Contains("-") && (textBox1.Text.Substring(0, 1) != "-" || textBox1.Text.Split('-').Length > 2))
            {
                bool headingDash = false;
                if (textBox1.Text.Substring(0, 1) == "-")
                {
                    headingDash = true;
                }
                textBox1.Text = textBox1.Text.Replace("-", "");
                if (headingDash)
                {
                    textBox1.Text = "-" + textBox1.Text;
                }
            }
        }
    }
于 2013-07-04T09:36:28.127 に答える
0

これは私にとってはうまくいきます(ただし、小数点記号の処理方法に応じて、いくつかの変更を検討する場合があります(数値形式はCurrentCulture設定に依存するため)

これは数値のみを受け入れ、入力の長さとその他のフォーマット (たとえば、小数点記号の前に許可されるのは 1 桁のみ) は対処されませんが、それを行うように変更できると思います。

public enum NumericTextBoxType { TDecimal = 1, TByte, TShort, TInt, TLong }

    public class NumericTextBox : TextBox
    {
        #region ARRAYS

        private static readonly Keys[] separators = 
        {
        Keys.Decimal,
        Keys.Oemcomma,
        Keys.OemPeriod
        };

        private static readonly Keys[] allowed =
        {
        Keys.D1,
        Keys.D2,
        Keys.D3,
        Keys.D4,
        Keys.D5,
        Keys.D6,
        Keys.D7,
        Keys.D8,
        Keys.D9,
        Keys.D0,
        Keys.NumPad0,
        Keys.NumPad1,
        Keys.NumPad2,
        Keys.NumPad3,
        Keys.NumPad4,
        Keys.NumPad5,
        Keys.NumPad6,
        Keys.NumPad7,
        Keys.NumPad8,
        Keys.NumPad9,
        Keys.Decimal,
        Keys.Oemcomma,
        Keys.OemPeriod,
        Keys.OemMinus,
        Keys.Subtract,
        Keys.Back,
        Keys.Delete,
        Keys.Tab,
        Keys.Enter,
        Keys.Up,
        Keys.Down,
        Keys.Left,
        Keys.Right
        };

        private static readonly Keys[] intallowed =
        {
        Keys.D1,
        Keys.D2,
        Keys.D3,
        Keys.D4,
        Keys.D5,
        Keys.D6,
        Keys.D7,
        Keys.D8,
        Keys.D9,
        Keys.D0,
        Keys.NumPad0,
        Keys.NumPad1,
        Keys.NumPad2,
        Keys.NumPad3,
        Keys.NumPad4,
        Keys.NumPad5,
        Keys.NumPad6,
        Keys.NumPad7,
        Keys.NumPad8,
        Keys.NumPad9,
        Keys.OemMinus,
        Keys.Subtract,
        Keys.Back,
        Keys.Delete,
        Keys.Tab,
        Keys.Enter,
        Keys.Up,
        Keys.Down,
        Keys.Left,
        Keys.Right
        };

        #endregion ARRAYS

        #region PROPERTY NumericTextBoxType

        private NumericTextBoxType _NumericTextBoxType = NumericTextBoxType.TDecimal;

        public NumericTextBoxType NumericTextBoxType
        {
            get
            {
                return
                _NumericTextBoxType;
            }
            set
            {
                _NumericTextBoxType = value;
            }
        }

        #endregion PROPERTY NumericTextBoxType

        #region PROPERTY AllowMinus

        public bool AllowMinus { get; set; }

        #endregion

        string prvText = "";
        int prevSelStart = 0;

        public NumericTextBox()
            : base()
        {
            this.NumericTextBoxType = NumericTextBoxType.TDecimal;
            this.AllowMinus = true;
        }

        #region EVENT METHOD OnKeyDown

        protected override void OnKeyDown(KeyEventArgs e)
        {
            base.OnKeyDown(e);

            if (e.Modifiers == Keys.Control)
            {
                prvText = this.Text;
                prevSelStart = this.SelectionStart;
                return;
            }

            // ignore not allowed
            if (NumericTextBoxType != NumericTextBoxType.TDecimal)
            {
                if (!intallowed.Contains(e.KeyCode)) e.SuppressKeyPress = true;
            }
            else
            {
                if (!allowed.Contains(e.KeyCode)) e.SuppressKeyPress = true;
                else if (separators.Contains(e.KeyCode))
                {
                    NumberFormatInfo numberFormatInfo = System.Globalization.CultureInfo.CurrentCulture.NumberFormat;
                    string decimalSeparator = numberFormatInfo.NumberDecimalSeparator;

                    int selLength = this.SelectionLength;
                    int selStart = this.SelectionStart;

                    if (!this.Text.Remove(selStart, selLength).Contains(decimalSeparator))
                    {
                        this.Text = this.Text
                        .Remove(selStart, selLength)
                        .Insert(this.SelectionStart, decimalSeparator);
                        this.SelectionStart = selStart + decimalSeparator.Length;
                    }
                    e.SuppressKeyPress = true;
                }
            }

            // ignore minus if not first or not allowed
            if (e.KeyCode == Keys.OemMinus || e.KeyCode == Keys.Subtract)
            {
                if (!this.AllowMinus) e.SuppressKeyPress = true;
                else if (NumericTextBoxType == NumericTextBoxType.TByte) e.SuppressKeyPress = true;
                else if (this.SelectionStart > 0) e.SuppressKeyPress = true;
            }

            prvText = this.Text;
            prevSelStart = this.SelectionStart;
        }

        #endregion EVENT METHOD OnKeyDown

        #region METHOD OnTextChanged

        protected override void OnTextChanged(EventArgs e)
        {
            base.OnTextChanged(e);

            // don't allow incorrect paste operations
            if (Regex.IsMatch(this.Text, (!AllowMinus ? "[-" : "[") + @"^\d.,]") ||
            Regex.Matches(this.Text, @"[.,]").Count > 1)
            {
                this.Text = prvText;
                this.SelectionStart = prevSelStart;
            }
        }

        #endregion

    }
于 2013-07-04T09:51:06.020 に答える
0

文字列の長さをチェックする (そしてそれがゼロでない場合は "-" を破棄する) 代わりに、カーソル位置をチェックし、カーソルが先頭ではない場合、または "-" が既に存在する場合は "-" を破棄することができます。始まり。

ただし、キーストロークを飲み込むのではなく、送信中に後で全体のチェックを行う方が、UX が向上する可能性があります。

于 2013-07-04T09:29:49.853 に答える