Reputation: 381
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
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
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