You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#/Winforms如何设置TextBox仅允许删除、退格、数字、单个小数点及开头单个负号

C# Winforms TextBox数值输入限制调整方案

修改后完整代码

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    TextBox currentTextBox = sender as TextBox;
    if (currentTextBox == null) return;

    // 允许控制键:如果需要严格仅支持backspace、delete,可替换为下方注释的判断逻辑
    if (char.IsControl(e.KeyChar))
    // if (e.KeyChar == (char)8 || e.KeyChar == (char)127) // 仅允许backspace(ASCII 8)、delete(ASCII 127)
    {
        return;
    }

    // 负号输入限制:仅允许在开头输入1个
    if (e.KeyChar == '-')
    {
        if (!currentTextBox.Text.Contains("-") && currentTextBox.SelectionStart == 0)
        {
            return;
        }
        e.Handled = true;
        return;
    }

    // 数字直接放行
    if (char.IsDigit(e.KeyChar))
    {
        return;
    }

    // 小数点输入限制:仅允许存在1个
    if (e.KeyChar == '.')
    {
        if (currentTextBox.Text.IndexOf('.') == -1)
        {
            return;
        }
        e.Handled = true;
        return;
    }

    // 其余所有字符全部拦截
    e.Handled = true;
}

逻辑说明

  • 控制键处理:默认放行了所有控制类按键(包含backspace、delete、方向键等),如果需要严格仅允许backspace、delete两个控制键,替换对应判断逻辑即可
  • 负号限制:仅当文本框内无负号、且光标处于文本最开头位置时允许输入负号,避免出现多个负号、负号在文本中间的异常情况
  • 数字处理:0-9的数字字符直接放行
  • 小数点限制:全局仅允许输入1个小数点,重复输入会被直接拦截
  • 兜底逻辑:所有不在上述允许范围内的字符全部拦截,避免非法字符输入

可选优化

如果需要支持选中全部文本后输入负号直接替换原有内容的场景,可将负号判断的条件修改为:

if (!currentTextBox.Text.Contains("-") && currentTextBox.SelectionStart == 0 
    || currentTextBox.SelectedText == currentTextBox.Text)

内容的提问来源于stack exchange,提问作者Baibers

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 10:48:03