【问题标题】:textbox validation for allow one " . " value c#允许一个“。”值c#的文本框验证
【发布时间】:2012-12-08 05:45:00
【问题描述】:

我希望文本框验证只允许一个 . 值和数字。意味着我的文本框值应该只采用数字和一个 . 值。值应该是 123.50。 我正在使用代码在我的值末尾添加 .oo.50 值。 我的代码是

double x;
double.TryParse(tb.Text, out x);
tb.Text = x.ToString(".00");

它从键盘上获取所有键,但我只想获取数字和一个 . 值。

【问题讨论】:

  • 只是一个想法,您是否考虑过使用 NumericUpDown 控件?
  • 不...应该是文本框
  • Konstantin 给出了正确的答案,但我想在这里指出一件事——像这样将其放回文本框会使您陷入循环,因为它会更改导致其再次验证的文本。此外,您将丢弃 TryParse 的结果——如果它无效,它会将缓冲区归零而不是拒绝有问题的键。

标签: c# .net winforms textbox


【解决方案1】:

为您的文本框添加一个Control.KeyPress 事件处理程序。

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (!char.IsControl(e.KeyChar))  //bypass control keys
    {
        int dotIndex = textBox1.Text.IndexOf('.');
        if (char.IsDigit(e.KeyChar))     //ensure it's a digit
        {   //we cannot accept another digit if
            if (dotIndex != -1 &&  //there is already a dot and
                //dot is to the left from the cursor position and
                dotIndex < textBox1.SelectionStart &&
                //there're already 2 symbols to the right from the dot
                textBox1.Text.Substring(dotIndex + 1).Length >= 2)
            {
                e.Handled = true;
            }
        }
        else //we cannot accept this char if
            e.Handled = e.KeyChar != '.' || //it's not a dot or
                        //there is already a dot in the text or
                        dotIndex != -1 ||   
                        //text is empty or
                        textBox1.Text.Length == 0 || 
                        //there are more than 2 symbols from cursor position
                        //to the end of the text
                        textBox1.SelectionStart + 2 < textBox1.Text.Length;
    }
}

您可以通过设计器或在您的构造函数中这样做:

public Form1()
{
    InitializeComponent();
    //..other initialization
    textBox1.KeyPress += new KeyPressEventHandler(textBox1_KeyPress);
}

我还添加了几项检查以确保您不仅可以在文本末尾插入数字,还可以在任何位置插入数字。与点相同。它控制您从点右侧不超过 2 位数字。我使用TextBox.SelectionStart Property 来获取光标在文本框中的位置。查看此线程以获取更多信息:How do I find the position of a cursor in a text box?

【讨论】:

  • 非常感谢......它正在工作,先生......但是后退空间不起作用。我能做什么?
  • 试试这个 if(e.KeyChar.Equals('\b')) { e.Handled = false; } else { // 你剩下的代码 }
【解决方案2】:

只需在 textBox 的 keyPress 事件中执行此操作 ...

        e.Handled = !char.IsDigit(e.KeyChar)&&(e.KeyChar != '.') && !char.IsControl(e.KeyChar);
        if ((e.KeyChar == '.') && ((sender as TextBox).Text.IndexOf('.') > -1))
        {
            e.Handled = true;
        }

【讨论】:

    【解决方案3】:

    试试这个

    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 == '.'
                && textBox1.Text.IndexOf('.') > -1)
                e.Handled = true;
        }
    

    【讨论】:

      【解决方案4】:

      试试这个代码,然后替换你想要的输入类型'validinpu'字符串。

      try
      {
          short charCode = (short)Strings.Asc(e.KeyChar);
          string validinput = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-0123456789 .";
          if (Strings.InStr(validamt, Conversions.ToString(Strings.Chr(charCode)), Microsoft.VisualBasic.CompareMethod.Binary) == 0)
          {
              charCode = 0;
          }
          if (charCode == 0)
          {
              e.Handled = true;
          }
      }
      

      【讨论】:

        【解决方案5】:

        另一个例子,

         private void txtPrice_KeyPress(object sender, KeyPressEventArgs e)
            {
                 // To disallow typing in the beginning writing
                if (txtPrice.Text.Length == 0)
                {
                    if (e.KeyChar == '.')
                    {
                        e.Handled = true;
                    }
                }
                if (!char.IsDigit(e.KeyChar) && e.KeyChar != 8 && e.KeyChar != 46)
                {
                    e.Handled = true;
                }
                if (e.KeyChar == '.' && txtPrice.Text.IndexOf('.') > -1)
                {
                    e.Handled = true;
                }
            }
        

        【讨论】:

          【解决方案6】:

          也试试这个短款

          e.Handled = (!(e.KeyChar == (char)Keys.Back || e.KeyChar == '.')); //allow  dot and Backspace
          e.Handled = (e.KeyChar == '.' && TextBox1.Text.Contains(".")); //allow only one dot
          

          这个例子只允许一个 dotbackspace

          【讨论】:

            【解决方案7】:
             if (textBox.Text!="")
                    {
                        string txt = textBox.Text;
                        if (e.KeyChar.ToString().Any(Char.IsNumber) || e.KeyChar == '.')
                        {
                            textBox.Text = rate;
                        }
                        else
                        {
                            MessageBox.Show("Number Only", "Warning");
                            textBox.Text = "";
                        }
                    }
            

            我测试过的代码

            【讨论】:

              【解决方案8】:
              if(e.KeyChar.Equals('\b'))
               {
                e.Handled = false;
               }
              else
               if (!char.IsControl(e.KeyChar)
                         && !char.IsDigit(e.KeyChar)
                         && e.KeyChar != '.')
                {
                      e.Handled = true;
                }
               else
                  // only allow one decimal point
                  if (e.KeyChar == '.'
                      && textBox1.Text.IndexOf('.') > -1)
                {        
                  e.Handled = true;  
                }
              

              【讨论】:

                猜你喜欢
                • 2012-10-26
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-11-27
                • 1970-01-01
                相关资源
                最近更新 更多