How to stop the first character in a text box from being '.'?

南楼画角 提交于 2019-12-23 04:45:42

问题


This is the code I currently have:

private void textBox_KeyPress(object sender, KeyPressEventArgs e)
{
    e.Handled = !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar) && e.KeyChar != '.';
    if (e.KeyChar == '.' && (sender as TextBox).Text.IndexOf('.') > -1) e.Handled = true; 

}

回答1:


KeyPress isn't good enough to do this kind of validation. A simple way to bypass it is to paste text into the text box with Ctrl+V. Or the context menu, no key event at all.

In this specific case, the TextChanged event will get the job done:

    private void textBox_TextChanged(object sender, EventArgs e) {
        var box = (TextBox)sender;
        if (box.Text.StartsWith(".")) box.Text = "";
    }

But there's a lot more to validating numeric values. You also need to reject stuff like 1.1.1 or 1.-2 etcetera. Use the Validating event instead. Drop an ErrorProvider on the form and implement the event like this:

    private void textBox_Validating(object sender, CancelEventArgs e) {
        var box = (TextBox)sender;
        decimal value;
        if (decimal.TryParse(box.Text, out value)) errorProvider1.SetError(box, "");
        else {
            e.Cancel = true;
            box.SelectAll();
            errorProvider1.SetError(box, "Invalid number");
        }
    }



回答2:


You probably want to use the TextChanged event, since the user could paste in values. For the best experience given the requirements, I'd suggest simply removing any leading . characters.

void textBox1_TextChanged(object sender, EventArgs e)
{
  if (textBox1.Text.StartsWith("."))
  {
    textBox1.Text = new string(textBox1.Text.SkipWhile(c => c == '.').ToArray());
  }
}

This does not address a requirement to use only digits -- wasn't clear in the question if that is the case.




回答3:


This works for copy and pasting too.

    private void textBox1_KeyUp(object sender, KeyEventArgs e)
    {
        int decimalCount=0;
        string rebuildText="";
        for(int i=0; i<textBox1.Text.Length; i++)
        {
            if (textBox1.Text[i] == '.')
            {
                if (i == 0) break;
                if (decimalCount == 0)
                    rebuildText += textBox1.Text[i];
                decimalCount++;
            }
            else if ("0123456789".Contains(textBox1.Text[i]))
                rebuildText += textBox1.Text[i];
        }
        textBox1.Text = rebuildText;    
        textBox1.SelectionStart = textBox1.Text.Length;

    }



回答4:


You can try this:

private void TextBox_TextChanged(object sender, EventArgs e)        
{        
        TextBox.Text = TextBox.Text.TrimStart('.');        
}


来源:https://stackoverflow.com/questions/10253107/how-to-stop-the-first-character-in-a-text-box-from-being

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!