5

textbox数値(10進数の場合もあります)と負の値のみを受け入れる必要があるがあります。

現在、私はこのようなKeyPressイベントを開催しています

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

負の値を許可するには、他に何をすべきですか?

ありがとう

4

7 に答える 7

11
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;

// only allow minus sign at the beginning
if (e.KeyChar == '-' && (sender as TextBox).Text.Length > 0)
    e.Handled = true;

LBがコメントで正しく言及しているように、これはのようないくつかの高度な表記法を許可しません3E-2が、単純な数値の場合はうまくいきます。

于 2012-10-31T12:51:39.507 に答える
2

@DennisTraubの作品ですが、省略されているコーナーケースがいくつかあります。たとえば、テキストボックス内のテキストが「-11」で、ユーザーがテキストの先頭にカーソルを置いている場合、テキストが「1-11」または「.-」になるように、別の文字を入力できます。 11"。これは私のために働くように思われる彼の答えの拡張です。

TextBox textBox = sender as TextBox;
// If the text already contains a negative sign, we need to make sure that 
//    the user is not trying to enter a character at the start
// If there is already a negative sign and the negative sign is not selected, the key press is not valid
// This allows the user to highlight some of the text and replace it with a negative sign
if ((textBox.Text.IndexOf('-') > -1) && textBox.SelectionStart == 0 && !textBox.SelectedText.Contains('-'))
{
    e.Handled = true;
}
// Do not accept a character that is not included in the following
if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && e.KeyChar != '.' && e.KeyChar != '-')
{
    e.Handled = true;
}
// Only allow one decimal point
if ((e.KeyChar == '.') && (textBox.Text.IndexOf('.') > -1))
{
    e.Handled = true;
}            
// The negative sign can only be at the start
if ((e.KeyChar == '-'))
{
    // If the cursor is not at the start of the text, the key press is not valid
    if (textBox.SelectionStart > 0)
    {
        e.Handled = true;
    }
    // If there is already a negative sign and the negative sign is not selected, the key press is not valid
    // This allows the user to highlight some of the text and replace it with a negative sign
    if (textBox.Text.IndexOf('-') > -1 && !textBox.SelectedText.Contains('-'))
    {
        e.Handled = true;
    }
}

私は1行にまとめることができるいくつかのものを分解しました。ただし、基本的には、テキストにすでに負の符号が含まれているかどうか、およびユーザーがテキストの先頭にカーソルを持っているかどうかも確認する必要があります。

于 2018-06-05T13:20:42.660 に答える
1

テキストボックスには、挿入されているものに入力を設定できるプロパティがあると思いました。現在は確認できませんが。

それ以外の場合は、別の方法として、値を送信するときに入力をdoubleに解析してみることができます。何かのようなもの:

double myDouble;
try
{
    myDouble = double.parse(textbox.Text)
}
catch (Exception e)
{
    MessageBox.Show("Input is incorrect", "Error")
}

これはおそらく最善の回避策ではありませんが、うまくいく可能性があります。

于 2012-10-31T12:51:13.570 に答える
1

次のように、Validatingイベントをフックします。

private void myTextBox_Validating(object sender, CancelEventArgs event) {
    decimal d;
    if(!decimal.TryParse(myTextBox.Text, out d) {
        event.Cancel = true;
        //this.errorProvider1.SetError(myTextBox, "My Text Box must be a negative number."); //optional
        return;
    }

    if(d >= 0) {
        event.Cancel = true;
        //this.errorProvider1.SetError(myTextBox, "My Text Box must be a negative number."); //optional
        return;
    }
}
于 2012-10-31T12:57:33.570 に答える
0

何かのようなもの:

var regex = new Regex("^[-]?\d+(\.\d+)?$", RegexOptions.Compiled);
Match m = regex.Match(textbox.Text + e.KeyChar);
e.Handled = m.Success;

編集:今では任意の実数を許可します

于 2012-10-31T12:52:59.653 に答える
0
// Boolean flag used to determine when a character other than a number is entered. 
        private bool nonNumberEntered = false;

        // Handle the KeyDown event to determine the type of character entered into the control. 
        private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
        {
            // Initialize the flag to false.
            nonNumberEntered = false;

            // Determine whether the keystroke is a number from the top of the keyboard. 
            if (e.KeyCode < Keys.D0 || e.KeyCode > Keys.D9)
            {
                // Determine whether the keystroke is a number from the keypad. 
                if (e.KeyCode < Keys.NumPad0 || e.KeyCode > Keys.NumPad9)
                {
                    // Determine whether the keystroke is a backspace. 
                    if(e.KeyCode != Keys.Back)
                    {
                        // A non-numerical keystroke was pressed. 
                        // Set the flag to true and evaluate in KeyPress event.
                        nonNumberEntered = true;
                    }
                }
            }
            //If shift key was pressed, it's not a number. 
            if (Control.ModifierKeys == Keys.Shift) {
                nonNumberEntered = true;
            }
        }

        // This event occurs after the KeyDown event and can be used to prevent 
        // characters from entering the control. 
        private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
        {
            // Check for the flag being set in the KeyDown event. 
            if (nonNumberEntered == true)
            {
                // Stop the character from being entered into the control since it is non-numerical.
                e.Handled = true;
            }
        }
于 2012-10-31T12:53:01.243 に答える
0

この正規表現を試してください

"/^(?!0*[.,]0*$|[.,]0*$|0*$)\d+[,.]?\d{0,2}$/" 

System.Text.RegularExpressions名前空間を使用します

ここの例を参照してください:http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.aspx

于 2012-10-31T12:58:26.290 に答える