Search code examples
c#numericupdown

How to disable more than one NumericUpDown controls using one method?


i have a form with more than one NumericUpDown as controls to input answer. i want every input is true for an operation (multiplication, sum etc), NumericUpDown for that operation will be disable. i have used the code below (just for sum operation), but i think its not efficient because i have to make a method to check every operation.

 private void IsSumTrue() {
        if (add1 + add2 == sum.Value)
        {
            sum.Enabled = false;
        }
    }

    private void IsDifferenceTrue()
    {
        if (add1 - add2 == difference.Value)
        {
            difference.Enabled = false;
        }
    }

    private void IsProductTrue()
    {
        if (add1 * add2 == product.Value)
        {
            product.Enabled = false;
        }
    }

    private void IsQuotientTrue()
    {
        if (add1 / add2 == quotient.Value)
        {
            quotient.Enabled = false;
        }
    }

anyone have idea how to make it more efficient with just a method for all operation?

below is my idea, but to check the value is true for every NumericUpDown i don't know how.

private void DisableIfValueIsTrue()
    {
        foreach(Control control in this.Controls)
        {
            NumericUpDown value = control as NumericUpDown;
            // if(value [NEED HELP]

        }
    }

Solution

  • Considering your situtaion, you can set a tag for each NumericUpDown in design mode like this:

    sum.Tag=1;
    square.Tag=2;
    etc
    

    Then define some int variables:

    int iSum=add1+add2;
    int iSquare= //Whatever you want
    etc
    

    And finally loop through your controls this way:

    foreach (NumericUpDown control in this.Controls.OfType<NumericUpDown>())
    {
      int intCondition = Convert.ToInt32(control.Tag) == 1
                          ? iSum
                          : Convert.ToInt32(control.Tag) == 2
                            ? iSquare
                            : Convert.ToInt32(control.Tag) == 3
                               ? i3
                               : i4; //You should extend this for your 8 controls
    control.Enabled = intCondition == control.Value;
    }
    

    OK! Second way I offer

    Since you will have to always check 8 different conditions, you could simply forget about looping through the controls and just change your method like this:

    private void DisableIfValueIsTrue() 
    {
      sum.Enabled = add1 + add2 != sum.Value;
      difference.Enabled= add1 - add2 != difference.Value;
      product.Enabled= add1 * add2 != product.Value;
      quotient.Enabled= (add2 !=0) && (add1 / add2 != quotient.Value);
      //etc
    }