c# - C# TextBox 中的负数

标签 c# winforms textbox

我已经完成了这里的问题,并找到了使文本框只接受以一位小数和开头为负号的数值的答案。

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

但是我确实有一个问题。假设用户输入了一个数字:

123455789764

然后他意识到这个数字是负数。他回到开头,试图输入负号,却发现打不通。有没有办法解决这个问题,而不是让用户删除他输入的数字,添加负数并再次重新输入数字?

最佳答案

试试这个:

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,但是它有点不好,即使是上面的方式也没有带来良好的视觉效果(当尝试将文本粘贴到数字文本框中时,您可以看到文本发生变化并恢复为有效值。

关于c# - C# TextBox 中的负数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17466575/

相关文章:

c# - 为什么 DateTime.AddHours 似乎不起作用?

c# - 在数据库中上传检查

c# - 更改文本框高度?

c# - 将 Sentry.NET 与 log4net 结合使用

c# - 我只想让我的客户向我的服务器打个招呼,但不能

C# usercontrol 如何访问所有子控件

c# - 在 winform TextBox 中自动完成 [包含而不是开始]

c# - TCPClient 异常的新实例

c# - 向 TextBox/RichTextBox 添加指南

c# - 为什么TextBox Border Color在WPF中坚持不变?