得到并设置不工作

时间:2011-04-22 18:31:07

标签: c# wpf validation get set

我正在编写以下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;
}

5 个答案:

答案 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所做的是返回truefalse,具体取决于它是否成功,如果成功,则将out参数与结果一起填充。

所以这样做的是,如果它无法解析结果,或者结果是<= 0它会显示消息框。在这种情况下,它也是方法的return,因此其余部分不会被执行。或者,方法的其余部分可以在else块中,在这种情况下不需要return。这是一种优先考虑的风格。

答案 4 :(得分:0)

您不应该在set语句中处理焦点。

此外,您需要确保该值不为null,否则您无法将其与任何内容(大于等)进行比较。