我正在编写以下get和set来验证来自文本框的输入。基本上它应该检查用户是否输入了所有值。 当我将TextBoxes留空时,它什么都不做,并在输出中显示一个'0',其中使用了该变量。但它会显示系统生成的异常并停止执行,但我想知道它为什么不通过属性验证输入?
这是我的代码:
public double RecoDoseSize
{
get
{
return recoDoseSize;
}
set
{
if (!(value>0))
{
MessageBox.Show("Please Enter the recommended dose size for this product");
textBox8.Focus();
}
recoDoseSize = value;
}
}
private void Submit2_Click(object sender, RoutedEventArgs e)
{
TotalContentProduct = double.Parse(textBox7.Text);
recoDoseSize = double.Parse(textBox8.Text);
NoOfDosespUnit = TotalContentProduct/recoDoseSize;
}
答案 0 :(得分:6)
您正在设置recoDoseSize
,即支持字段,而不是RecoDoseSize
,其中包含您的代码的属性。因此,您的代码不会被执行。您需要将方法体的第二行更改为
RecoDoseSize = double.Parse(textBox8.Text);
(请注意首都R
)。
答案 1 :(得分:1)
你实际上从未使用过getter / setter。您正在使用实际字段名称:recoDoseSize
。将其更改为RecoDoseSize
。
答案 2 :(得分:1)
private void Submit2_Click(object sender, RoutedEventArgs e)
{
TotalContentProduct = double.Parse(textBox7.Text);
RecoDoseSize= double.Parse(textBox8.Text);
NoOfDosespUnit = TotalContentProduct/recoDoseSize;
}
答案 3 :(得分:1)
其他人对所述问题给出了正确答案。也就是说,如果你想使用getter / setter,你应该调用大写的RecoDoseSize
。
然而,在setter中显示一个消息框是非常糟糕的做法,因为它违反了最小惊喜原则。
当有人查看第RecoDoseSize = double.Parse(textBox8.Text);
行时,显然此操作可能会导致出现消息框。
有时会出现例外情况,即更改setter触发器UI会更改(例如控件上的Visible
属性)但是默认情况下应始终不执行此操作,除非您确定它会更多令人困惑的是不这样做(例如,如果你设置Visible = false
但它仍然可见,那就太令人惊讶了。)
关于你应该如何实现它的评论,检查应该在点击处理程序中进行,属性可以只是一个自动属性,如下所示:
public double RecoDoseSize { get; set; }
private void Submit2_Click(object sender, RoutedEventArgs e)
{
TotalContentProduct = double.Parse(textBox7.Text);
double enteredSize;
if (!double.TryParse(textBox8.Text, out enteredSize) || enteredSize <= 0)
{
MessageBox.Show("Please Enter the recommended dose size for this product");
textBox8.Focus();
return;
}
RecoDoseSize = enteredSize;
NoOfDosespUnit = TotalContentProduct / recoDoseSize;
}
你会想要使用TryParse,因为对于Parse,如果文本不是有效的double
,你会收到错误。 TryParse所做的是返回true
或false
,具体取决于它是否成功,如果成功,则将out参数与结果一起填充。
所以这样做的是,如果它无法解析结果,或者结果是<= 0
它会显示消息框。在这种情况下,它也是方法的return
,因此其余部分不会被执行。或者,方法的其余部分可以在else
块中,在这种情况下不需要return
。这是一种优先考虑的风格。
答案 4 :(得分:0)
您不应该在set语句中处理焦点。
此外,您需要确保该值不为null,否则您无法将其与任何内容(大于等)进行比较。