Search code examples
c#winformsnumericupdown

How to get text of NumericUpDown before valuechanged event?


I want to make it work this way: when I write to NumericUpDown 1k the value should be 1000, when I write 4M the value should be 4000000. How can I make it? I tried this:

private void NumericUpDown1_KeyDown(object sender, KeyEventArgs e)
{
    if(e.KeyValue == (char)Keys.K)
    {
        NumericUpDown1.Value = NumericUpDown1.Value * 1000;
    }
}

But it works with the original value that I wrote.

I want to make it work as a macroses. For example, If I want to get NUD1.Value 1000, I write 1 and then, when I press K the NUD1.Value becomes 1000.


Solution

  • Let's assume we have a NumericUpDown named numericUpDown1. Whenever the user presses k, we want to multiply the current value of the NUP by 1,000, and if the user presses m, the current value should be multiplied by 1,000,000. We also don't want the original value to trigger the ValueChanged event. So, we need to have a bool variable to indicate that the value is being updated.

    Here's a complete example:

    private bool updatingValue;
    
    private void numericUpDown1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyData != Keys.K && e.KeyData != Keys.M) return;
    
        int multiplier = (e.KeyData == Keys.K ? 1000 : 1000000);
    
        decimal newValue = 0;
        bool overflow = false;
        try
        {
            updatingValue = true;
            newValue = numericUpDown1.Value * multiplier;
        }
        catch (OverflowException)
        {
            overflow = true;
        }
        updatingValue = false;
    
        if (overflow || newValue > numericUpDown1.Maximum)
        {
            // The new value is greater than the NUP maximum or decimal.MaxValue.
            // So, we need to abort.
            // TODO: you might want to warn the user (or just rely on the beep sound).
            return;
        }
    
        numericUpDown1.Value = newValue;
        numericUpDown1.Select(numericUpDown1.Value.ToString().Length, 0);
        e.SuppressKeyPress = true;
    }
    

    And the ValueChanged event handler should be something like this:

    private void numericUpDown1_ValueChanged(object sender, EventArgs e)
    {
        if (updatingValue) return;
    
        // Simulating some work being done with the value.
        Console.WriteLine(numericUpDown1.Value);
    }