【问题标题】:get and Set not working获取和设置不起作用
【发布时间】:2011-04-22 18:31:07
【问题描述】:

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

【问题讨论】:

  • 我对代码示例不是很清楚。 recoDoseSize 是否与 RecoDoseSize 相同,或者它是一个不相关的私有变量?你指的是this.RecoDoseSize吗?
  • 在您描述的情况下得到 0 的原因是 ParseMethod 在文本框中的 Text 属性的默认值上尽力而为。
  • @dawebber:由于 RecoDoseSize 的 getter 返回 recoDoseSize,我猜它们是相关的。 ;-)
  • 您需要注意 RecoDoseSize 是否为 0(零)以避免您让用户进入的讨厌的除零。另外,如果这是在其他人可能使用的“公共”库中,我会将属性重命名为 DoseSize 或 RecommendedDoseSize:我的第一个问题是“Reco”到底是什么。
  • @Heinzi——在这个代码示例中有很多东西需要猜测。我评论的真正目的是向 OP 证明应该更具体地使用代码示例。不过我同意你的看法,这是一个答案:使用属性,而不是私有变量。

标签: c# wpf validation get set


【解决方案1】:

您正在设置 recoDoseSize,支持字段,而不是 RecoDoseSize,其中包含您的代码的属性。因此,您的代码不会被执行。您需要将方法主体的第二行更改为

RecoDoseSize = double.Parse(textBox8.Text);

(注意大写R)。

【讨论】:

  • 另一个例子说明为什么不同的属性和字段是个坏主意。
  • @Pondidum:不,它通常可以工作(当然,如果你知道自己在做什么),不过我最近仍然切换到下划线字段。
  • @Pond 除非你使用的字体不好(或者我猜你的眼睛特别不好),否则很容易看出大写和小写首字母之间的区别。 (变量名的中间可能会更棘手,因为你的眼睛不会自然地集中在第一个/最后一个字母上)
  • 感谢大家的帮助。我的错,我把它改成了 RecoDoseSize,但它仍然做同样的事情。当我单击按钮时,它会引发系统生成的错误,但永远不会显示 Msg Box。:(
  • @Mango 您遇到的错误可能来自 Parse,因为它无法将文本转换为有效的 double。在我的回答中使用TryParse
【解决方案2】:

其他人已按照所述问题给出了正确答案。也就是说,如果你想使用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 参数。

如果它解析结果失败,或者结果是&lt;= 0,它会显示消息框。在这种情况下,它也来自该方法的returns,因此其余部分不会被执行。或者,该方法的其余部分可以在 else 块中,在这种情况下,不需要 return。选择哪种方式是一种风格的问题。

【讨论】:

  • 请问我应该如何在我的代码中实现此功能?我在这里有点学习:(
  • @Mango 您可能还想将TryParse 用于textBox7。如果您使用Parse,您的意思是我知道该文本将是有效的double,请为我解析它。当您不能 100% 确定它是否有效时,请使用 TryParse。您可能还需要考虑将文本框重命名为代表它们所包含的内容。
【解决方案3】:

您从未真正使用过 getter/setter。您正在使用实际的字段名称:recoDoseSize 直接。将其更改为RecoDoseSize

【讨论】:

    【解决方案4】:
    private void Submit2_Click(object sender, RoutedEventArgs e)
    {
        TotalContentProduct = double.Parse(textBox7.Text);
        RecoDoseSize= double.Parse(textBox8.Text);
        NoOfDosespUnit = TotalContentProduct/recoDoseSize;
    }
    

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 该属性是一个double,所以value 也是一个(不可为空的)双精度。它不会为空。
      • 小写的double 永远不能是null。除非它是可空类型:double?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-21
      • 1970-01-01
      • 1970-01-01
      • 2017-03-23
      • 2020-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多