必填字段不需要

时间:2014-01-09 19:27:26

标签: c# wpf xaml

我有3个必填字段。如果其中一个字段输入了数据,则不需要其他两个字段。这三个案例都是一样的。如果任何一个字段有数据,那么它们都不是必需的。

这是我的代码:

在初始化中:

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

他们的职能:

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);
   }

}

一切正常,直到我向其中一个字段添加数据,然后当我从其中一个字段中删除数据时,第三个字段再次成为必需。

2 个答案:

答案 0 :(得分:1)

跟踪哪些字段具有值

示例:

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));
}

每个文本框都有一个bool,表示它是否已设置。当它们全部未设置时,将打开所需的。当任何一个被设置然后它们都被关闭。

答案 1 :(得分:1)

你的逻辑错了

您的代码所做的是“当我更改文本字段X时,其他2个变为必需或不需要,无论其他什么”

您需要说的是“当我更改任何文本字段时,计算包含数据的文本字段数量,如果一个或多个数据包含数据,则将其他字段设置为不需要”

代码可能看起来像这样:

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)
    }
}

作为一项改进,您可以使用LINQ来缩短UpdateRequiredFields方法(我相信更好),但您必须了解LINQ方法的作用:

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)
    }
}