Bobby Ricky
Bobby Ricky

Reputation: 381

Required Fields to not required

I have 3 required fields. If one of the fields has data inputted into it, then the other two should be not required. The case is the same for all three. If any one field has data then none of them are required.

Here is my code:

In the initialized:

OrderTxt.TextChanged += OrderTxt_TextChanged;
NumberTxt.TextChanged += NumberTxt_TextChanged;
WarNumberTxt.TextChanged += WarNumberTxt_TextChanged;

Their functions:

public void OrderTxt_TextChanged(object sender, TextChangedEventArgs e)
{
    if (OrderTxt.Text != string.Empty)
    {
        NumberTxt.SetValue(Controls.Props.IsRequiredProperty, false);
        WarNumberTxt.SetValue(Controls.Props.IsRequiredProperty, false);
    }

    else
    {
        NumberTxt.SetValue(Controls.Props.IsRequiredProperty, true);
        WarNumberTxt.SetValue(Controls.Props.IsRequiredProperty, true);
    }

    }

public void NumberTxt_TextChanged(object sender, TextChangedEventArgs e)
{
   if (NumberTxt.Text != string.Empty)
   {
       OrderTxt.SetValue(Controls.Props.IsRequiredProperty, false);
       WarNumberTxt.SetValue(Controls.Props.IsRequiredProperty, false);
   }

   else
   {
       OrderTxt.SetValue(Controls.Props.IsRequiredProperty, true);
       WarNumberTxt.SetValue(Controls.Props.IsRequiredProperty, true);
   }

}

public void WarNumberTxt_TextChanged(object sender, TextChangedEventArgs e)
{
   if (WarNumberTxt.Text != string.Empty)
   {
       NumberTxt.SetValue(Controls.Props.IsRequiredProperty, false);
       OrderTxt.SetValue(Controls.Props.IsRequiredProperty, false);
   }

   else
   {
       NumberTxt.SetValue(Controls.Props.IsRequiredProperty, true);
       OrderTxt.SetValue(Controls.Props.IsRequiredProperty, true);
   }

}

Everything works until I add data to 2 of the fields then when I delete data from one of the fields, the third field becomes required again.

Upvotes: 0

Views: 443

Answers (2)

Orion Edwards
Orion Edwards

Reputation: 123622

Your logic is wrong

What your code does is say "When I change text field X, the other 2 become required or not required, regardless of anything else"

What you need it to say is "When I change any text field, count the number of text fields with data in them, and if one or more has data, set the others to be not required"

The code might look a bit like this:

public void OrderTxt_TextChanged(object sender, TextChangedEventArgs e) {
    UpdateRequiredFields();
}

public void NumberTxt_TextChanged(object sender, TextChangedEventArgs e) {
    UpdateRequiredFields();
}

public void WarNumberTxt_TextChanged(object sender, TextChangedEventArgs e) {
    UpdateRequiredFields();
}

private void UpdateRequiredFields() {
    var fields = new[] { OrderTxt, NumberTxt, WarNumberTxt };
    int nonEmptyCount = 0;
    foreach(var field in fields) {
        if(!String.IsNullOrWhitespace(field.Text)) {
            nonEmptyCount++;
        }
    }

    bool fieldsShouldBeRequired = true;
    if(nonEmptyCount > 0) {
        fieldsShouldBeRequired = false;
    }

    // set all the fields to required or not (this works equally well and is simpler)
    foreach(var field in fields) {
        field.SetValue(Controls.Props.IsRequiredProperty, fieldsShouldBeRequired)
    }
}

As an improvement you can use LINQ to make the UpdateRequiredFields method shorter (and I believe nicer), but you have to learn what the LINQ methods do:

private void UpdateRequiredFields() {
    var fields = new[] { OrderTxt, NumberTxt, WarNumberTxt };
    int nonEmptyCount = fields.Count(f => !String.IsNullOrWhitespace(f.Text));

    bool fieldsShouldBeRequired = (nonEmptyCount == 0);

    // set all the fields to required or not (this works equally well and is simpler)
    foreach(var field in fields) {
        field.SetValue(Controls.Props.IsRequiredProperty, fieldsShouldBeRequired)
    }
}

Upvotes: 1

Jean-Bernard Pellerin
Jean-Bernard Pellerin

Reputation: 12670

Keep track of which fields have values

example:

bool order, number, warnumber.

public void OrderTxt_TextChanged(object sender, TextChangedEventArgs e)
{
    order = OrderTxt.Text != string.empty;
    SetRequired();
}

public void NumberTxt_TextChanged(object sender, TextChangedEventArgs e)
{
    number = NumberTxt.Text != string.empty;
    SetRequired();
}


public void WarNumberTxt_TextChanged(object sender, TextChangedEventArgs e)
{
    warnumber = WarNumberTxt.Text != string.empty;
    SetRequired();
}

public void SetRequired()
{
    NumberTxt.SetValue(Controls.Props.IsRequiredProperty, !(order || number || warnumber));
    OrderTxt.SetValue(Controls.Props.IsRequiredProperty, !(order || number || warnumber));
    WarNumberTxt.SetValue(Controls.Props.IsRequiredProperty, !(order || number || warnumber));
}

This has a bool for each text box indicating if it's set or not. When they are all unset then required will be turned on. When any one is set then they are all turned off.

Upvotes: 1

Related Questions