2011-04-22 20 views
0

我正在寫下面的get和set來驗證來自文本框的輸入。基本上它應該檢查用戶是否輸入了所有的值。 當我將文本框留空時,它什麼也不做,並在輸出中顯示'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

我對代碼示例並不清楚。 recoDoseSize與RecoDoseSize相同,還是不相關的私有變量?你是指這個.RecoDoseSize? – dawebber 2011-04-22 18:36:22

+0

在您描述的情況下得到0的原因是由於ParseMethod在文本框中的Text屬性的默認值上做得最好。 – dawebber 2011-04-22 18:37:37

+0

@dawebber:由於RecoDoseSize的getter返回的是recoDoseSize,我猜它們是相關的。 ;-) – Heinzi 2011-04-22 18:37:51

回答

1

其他已經給出了所述問題的正確答案。即如果你想使用getter/setter,你應該調用uppercased 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。這是一種風格,哪種方式是首選。

+0

請問我該如何在我的代碼中實現這個功能?我有點在這裏做的學習:( – MangoTable 2011-04-22 19:05:42

+0

@Mango您也可能想爲'textBox7'使用'TryParse' 。如果你使用'Parse',你說我知道文本將是一個有效的'double',只是爲我解析。當你不能100%確定它是有效的時候使用'TryParse'。您可能還想考慮將文本框重命名爲表示它們所持有的內容。 – Davy8 2011-04-22 19:22:43

0

你不應該處理的重點在您所設定的語句。此外,您需要確保該值不爲空,否則您無法將其與任何內容(大於等)進行比較。

+2

該屬性是一個'double',所以'value'是一個(不可爲空)的double。它不會爲空。 – 2011-04-22 18:38:40

+2

小寫'double'永遠不能爲null。除非是可以爲空的類型:'double?' – pickypg 2011-04-22 18:39:27

6

您正在設置recoDoseSize,後臺字段,而不是RecoDoseSize,其中包含您的代碼的屬性。因此,你的代碼不會被執行。您需要在方法體的第二行改爲

RecoDoseSize = double.Parse(textBox8.Text); 

(注意是大寫R)。

+2

另一個例子說明爲什麼不同的屬性和字段的情況是一個壞主意。 – Pondidum 2011-04-22 18:42:40

+1

@Pondidum:Nah,它通常有效(如果你知道你在做什麼當然),但我最近還是改用了強調的字段。 – 2011-04-22 18:49:53

+0

@Pond,除非你使用的是不好的字體(或者我猜想有特別糟糕的眼睛),很容易看出大寫字母和小寫字母之間的區別。 (一個變量名稱的中間可能會更棘手,因爲你的眼睛自然不會像第一個/最後一個字母那樣聚焦) – Davy8 2011-04-22 18:53:05

1

你永遠不會使用getter/setter。您直接使用實際字段名稱:recoDoseSize。將其更改爲RecoDoseSize

1
private void Submit2_Click(object sender, RoutedEventArgs e) 
{ 
    TotalContentProduct = double.Parse(textBox7.Text); 
    RecoDoseSize= double.Parse(textBox8.Text); 
    NoOfDosespUnit = TotalContentProduct/recoDoseSize; 
}