有回响的山谷 2024-09-24 15:31 采纳率: 53.3%
浏览 65

winform的numericupdown限制输入问题

1、由于需求是 对输入的数值内容进行判断,而numericupdown控件自带数据上下限功能,就用numericupdown编写了需要的功能
2、但在numericupdown有一个输入超限内容,数据自动回滚功能,这与我的设计不一致,我需要的是输入超限内容后,numericupdown显示输入前内容,在查讯很多资料后,发现只有TextChanged事件可以满足需求
3、但是又遇到另一个问题,如果我numericupdown的数值上下限是20——200,输入1就直接报超限了,但我想输入的是100,请问这种该怎么处理
4、ValueChanged、Validating、KeyPress等事件都试过,输入超限内容,数值直接回滚到上下限,即输入后直接显示上下限值,根本不会进行超限范围判断
我numericupdown_TextChanged是这样写的

private void Num_TextChanged(object sender, EventArgs e)
{
NumericUpDown num = (NumericUpDown)sender;
string str = ((Control)num).Text;
if (string.IsNullOrEmpty(str.Replace("-", "").Replace(".", "")))
{
return;
}
else
{
decimal mval = 0;
if (decimal.TryParse(str, out mval))
{
if (mval > num.Maximum || mval < num.Minimum)
{
num.Value = ppStorage.GetData<Decimal>(num);
MessageBox.Show("输入的数值超限" + "\r\n" + "数值可修改范围:" + num.Minimum + "~" + num.Maximum);
}
else
{
;
}
}
else
{
num.Value = ppStorage.GetData<Decimal>(num);
}
}
}

  • 写回答

2条回答 默认 最新

  • 一轮明月照丘壑 2024-09-24 17:17
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    对于您的问题,我理解您在尝试自定义NumericUpDown控件的行为以便进行输入验证并阻止回滚行为。由于标准的NumericUpDown控件在输入超出限制的值时直接回滚到上下限,我们需要通过一些额外的逻辑来处理这种情况。这里有一些建议来解决您的问题:

    1. 处理输入超限问题:在TextChanged事件中检查输入的值是否超出限制是一个合理的策略。由于直接输入会得到结果上限值(如果值小于最小允许值)或下限值(如果值大于最大允许值),您需要在检测到输入超限时阻止这种回滚行为。您的代码已经处理了这一点,但是您可能需要调整逻辑以确保正确处理输入超限的情况。

    在您的代码中,当检测到输入值超出限制时,您应该手动设置NumericUpDown的值到当前的数值,而不是重新从ppStorage中获取数值。这可以通过简单地修改以下部分代码来实现:

    if (mval > num.Maximum || mval < num.Minimum)
    {
        // 直接设置当前值,防止回滚到上下限值
        num.Value = num.Value; // 这里确保保留当前值而不是重新获取存储的值
        MessageBox.Show("输入的数值超限" + "\r\n" + "数值可修改范围:" + num.Minimum + "~" + num.Maximum);
    }
    

    这样,即使输入了超限的值,也不会直接回滚到上下限值。用户会收到一个消息提示他们输入的值超出了范围,但NumericUpDown控件仍然会显示他们尝试输入的原始值。这样就不会出现用户尝试输入一个有效值但被直接替换为上下限值的情况。

    另外,对于输入数字字符时应设置Numlock关闭来允许其他输入符的设置以便提示错误:通过禁用全局NumLock或特定情况来处理问题键入的非正常状态可以处理异常情况和特殊的字符(例如插入无效数字时的自动替换问题)。这样做可以增加容错性和用户友好性。您的代码已经处理了这一点,通过移除无效字符来避免无效输入。这有助于确保用户不会意外地输入无效字符并导致控件自动回滚到上下限值。

    评论

报告相同问题?

问题事件

  • 创建了问题 9月24日