【问题标题】:Stagger increments in C# NumericUpDown controlC# NumericUpDown 控件中的交错增量
【发布时间】:2010-06-17 11:23:33
【问题描述】:

我在尝试为 c# 中的 NumericUpDown 控件配置特定配置时遇到了一些麻烦。

基本上,我已经看到我可以设置增量间隔,但我想根据单击的箭头(向上或向下)来管理增量间隔。我检查了控件的事件,但没有找到每个箭头的事件。

基本上,我想实现一个控件,在不同的值下,增量是不同的。

从 0.00 到 5.00 的增量为 0.01,从 5.00 到 20.00 的增量为 0.04,依此类推

这可能吗?

注意:当触发 valuechanged 事件时,最后一个值的控件中的历史值也很有用。这存在吗?

提前感谢您的任何意见或建议!!!

编辑:我对此进行了编辑,因为我没有正确解释它,我猜。这就是原因,因为我想知道按下了哪个箭头,向上还是向下。

这是我所拥有的,或多或少。我添加了所有范围,并使用模除法进行了一些检查,以避免使用键盘而不是箭头直接在值字段中设置不正确的值。问题是,如果我使用向上箭头通过限制,一切都很好。但是,如果我使用向下箭头,我会错过一步。

    if (cuotaUno.Value >= 30M && cuotaUno.Value < 50M)
    {
        cuotaUno.Increment = 2M;
        if (!((cuotaUno.Value % 2M) == 0))
        {
            cuotaUno.Value = cuotaUno.Value - (cuotaUno.Value % 2M);
        }

    }

    if (cuotaUno.Value >= 50M && cuotaUno.Value < 100M)
    {
        cuotaUno.Increment = 5M;
        if (!((cuotaUno.Value % 5M) == 0))
        {
            cuotaUno.Value = cuotaUno.Value - (cuotaUno.Value % 5M);
        }

    }

在这种情况下,如果值为 100 并且我单击向下,它会直接转到 90 而不是 95。但是,如果我在 90 并且我单击向上,它会正确转到 95 和 100。

【问题讨论】:

  • 为什么你必须知道按下了哪个按钮?只需检查 NumericUpDown.ValueChanged 事件处理程序中的值,并相应地调整 NumericUpDown.Increment。
  • 您将在达到 100 时将增量设置为 10M。现在当您返回时,它仍然是 10M,因此值现在变为 90M。当您将值从 50 减少时也会发生这种情况。它会变为 50。这是因为 (50-5) 是 45,并且它落在 30 到 49 的范围内,您已经检查了 2M 的整除性并减少了 1M,因此值为 44。检查我的解决方案以了解解决方法。
  • 当心!做逻辑时不要随时设置 cuotaUno.Value。只需将其存储在变量中,对变量进行逻辑处理,最后将其设置为属性。否则会再次触发 ValueChanged 事件。

标签: c# numericupdown


【解决方案1】:

您可以使用NumericUpDown.ValueChanged 事件和NumericUpDown.Increment 属性来创造奇迹。

作为旁注,只需检查 NumericUpDown.Accelerations 属性是否会对您有所帮助,因为我不知道您是否对增量或加速度非常特别。

更新

readonly decimal PART1 = 30M;
readonly decimal PART2 = 50M;
readonly decimal PART3 = 100M;
readonly decimal INC1 = 1M;
readonly decimal INC2 = 2M;
readonly decimal INC5 = 5M;
readonly decimal INC10 = 10M;

private void cuotaUno_ValueChanged(object sender, EventArgs e)
{
    decimal val = cuotaUno.Value;
    decimal inc = cuotaUno.Increment;
    decimal rem;

    if (val < PART1 && inc != INC1)
    {
        if (inc == INC2 && val == (PART1 -INC2))
            val += (inc - INC1);
        inc = INC1;
    }
    else if (val >= PART1 && val < PART2 && inc != INC2)
    {
        if (inc == INC5 && val == (PART2-INC5))
            val += (inc - INC2);
        inc = INC2;
        rem = val % INC2;
        if (rem != 0)
            val -= rem;
    }
    else if (val >= PART2 && val < PART3 && inc != INC5)
    {
        if (inc == INC10 && val == (PART3-INC10))
            val += (inc - INC5);
        inc = INC5;
        rem = val % INC5;
        if (rem != 0)
            val -= rem;
    }
    else if (val >= PART3 && inc != INC10)
    {
        inc = INC10;
        rem = val % INC10;
        if (rem != 0)
            val -= rem;
    }

    cuotaUno.Increment = inc;
    cuotaUno.Value = val;            
}

【讨论】:

  • 我如何知道使用该事件和属性按下了哪个箭头?我没看到:-(
  • 可以自己做 - 在每个 ValueChanged 上,将新值存储在某处,比如小数?您的子类的实例 var,那么您将能够在事件中判断当前值和最后一个值,这听起来就足够了(如果我解析正确的话)
  • 谢谢Veer,我认为直接将计算结果分配给值会再次触发事件,这会打开一罐蠕虫:-)再次感谢您的回答,它变成了非常有帮助。问候!
  • @mihe: I think that assigning directly the result of the calculation to the value was triggering the event again, which was opening a can of worms 不!这不是你的情况的实际原因。原因在我对您的回答的第一条评论中进行了解释。
【解决方案2】:

这不行吗?

private void NumericUpDown1_ValueChanged(Object sender, EventArgs e) 
{
    if(NumericUpDown1.Value >= 0 && NumericUpDown1.Value < 5)
    {
        NumericUpDown1.Increment = 0.01;
    }
    if(NumericUpDown1.Value >= 5 && NumericUpDown1.Value < 20)
    {
        NumericUpDown1.Increment = 0.04;
    }
}

【讨论】:

    【解决方案3】:

    制作您自己的控件来初始化 NumericUpDown 控件。

    重写 OnkeyDown 方法,检查当前值并更改增量,然后调用基类的实现。

    这就是我会尝试的。

    【讨论】:

    • 嗨,鲍勃,首先,感谢您的回答。不幸的是,我看不到 OnKeyDown 方法如何涵盖我想做的事情,因为控件可以通过多种方式进行更改,所以据我了解,它不能解决问题。谢谢!!
    猜你喜欢
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多