Search code examples
c#formswinformseventsnumericupdown

Event to NumericUpDown for only user interaction


I have 3 NumericUpDown elements in my form. This elements is synchronized by their sum. For example sum is 9 elements values is 3,3,3 and increment is 2. When user is changed first element up from 3 to 5 we must get 5,2,2.

For synchronized I had tried to use events ValueChanged and VisibleChanged, but they working when we have a programmatic modification or user interaction. I used this method for every element, but for this events this method starts changing again, when result values other elements is changing in a code.

 private void numericUpDown1Change(object sender, EventArgs e)
    {
        int oldValue = Sum - (int)numericUpDown2.Value - (int)numericUpDown3.Value;
        int average;
        if ((int)numericUpDown1.Value - oldValue > 0)
        {
            average = ((int)numericUpDown1.Value - oldValue) / 2;
            numericUpDown2.Value = numericUpDown2.Value - average;
            numericUpDown3.Value = numericUpDown3.Value - average;
        }
        else
        {
            average = (oldValue - (int)numericUpDown1.Value) / 2;
            numericUpDown2.Value = numericUpDown2.Value + average;
            numericUpDown3.Value = numericUpDown3.Value + average;
        }
    }

I want to use event, what worked just when user clicking the up or down button, or by the user entering a new value.

What event I must choose for it?


Solution

  • Use the ValueChanged event, but keep a flag telling you if the change is done by code or by user.

    For a single control you can keep a Boolean variable at the class level (I would probably call it IsValueChangedByCode) and set it to false. Inside your methods, right before you change the value, set it to true and right after that back to false. Inside the event handler check that flag is true or false, and decide if you want to execute the code or not.

    For 3 controls the logic is the same, but instead of using a boolean flag, you need 2 different booleans, or you can use an integer or flags enum.