我有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);
}
}
一切正常,直到我向其中一个字段添加数据,然后当我从其中一个字段中删除数据时,第三个字段再次成为必需。
答案 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)
}
}