2011-08-20 72 views
2

所以基本上我試圖讓Windows窗體應用程序來計算4個測試等級的平均值。但是,在一些課堂上,我可能只有3個測試。如果沒有四個測試文本框的值,程序將不會計算平均值。我試圖找出一個辦法,如果第四個文本框有什麼也沒有編碼,只是忽略它,計算其他3我的代碼如下:Textbox空問題

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace GradeCalc 
{ 
    public partial class Grades : Form 
    { 
     public Grades() 
     { 
      InitializeComponent(); 
     } 

     private void Submit_Click(object sender, EventArgs e) 
     { 
      double test1; 
      double test2; 
      double test3; 
      double test4; 
      double average4; 
      double average3; 

      //Here, I'm trying to achieve: 
      //if (t4 is empty) 
      //{find the average of the first 3 textboxes} 

      if (t4.Text == null) 
      { 
       test1 = double.Parse(t1.Text); 
       test2 = double.Parse(t2.Text); 
       test3 = double.Parse(t3.Text); 
       average3 = ((test1 + test2 + test3)/3); 
       tavg.Text = average3.ToString("00.00"); 
      } 
       //Here, I'm trying to achieve: 
       //if (t4 is not empty) 
       //{ calculate the average of all 4 textboxes} 

      else 
       if (t4.Text != null) 
       { 
        test1 = double.Parse(t1.Text); 
        test2 = double.Parse(t2.Text); 
        test3 = double.Parse(t3.Text); 
        test4 = double.Parse(t4.Text); 
        average4 = ((test1 + test2 + test3 + test4)/4); 
        tavg.Text = average4.ToString("00.00"); 
       } 
     } 
    } 
} 

我沒有很多的經驗與C#,所以任何幫助,將不勝感激。

回答

3

嘗試String.IsNullOrEmpty(t4.Text)

0

第四個文本框的內容可能不是不爲空,但只是一個空字符串。你可以使用String.IsNullOrEmpty()而不是用null來比較所有角度。但是如果有人把空間放在什麼地方呢?你可能也想修剪掉空白。

總的選擇是使用TryParse方法而不是Parse - 然後使用返回的成功布爾值來決定您有多少結果。的TryParse是這樣的:

if (Double.TryParse(t4.Text, out test4)) 
{ 
    // this works 
} 
else 
{ 
    // this did not 
} 
2

試試這個:以上

List<double> MyValues = new List<double>; 

double T; 

if (double.TryParse (t1.Text, out T)) 
    MyValues.Add (T); 

if (double.TryParse (t2.Text, out T)) 
    MyValues.Add (T); 

if (double.TryParse (t3.Text, out T)) 
    MyValues.Add (T); 

if (double.TryParse (t4.Text, out T)) 
    MyValues.Add (T); 

if (MyValues.Count > 0) 
    tavg.Text = MyValues.Average().ToString ("00.00"); 

代碼是健壯......如果任何文本(T1 - T4)是不是被跳過一個有效的數字。 ..平均值僅針對正確值(無論是1,2,3或4)進行計算......並且它處理沒有輸入有效值的情況...

您可以輕鬆修改它要求輸入至少3個有效號碼,將最後的if更改爲例如。

0

您可以通過解耦您要執行的各種任務來改善您的代碼。最初你想解析文本框中的數字。你可以做到這一點使用功能:

IEnumerable<Double> ParseValues(IEnumerable<TextBox> textBoxes) { 
    foreach (var textBox in textBoxes) { 
    Double value; 
    if (Double.TryParse(textBox.Text, out value)) 
     yield return value; 
    } 
} 

此功能需要TextBox對象的輸入序列併產生Double值跳過與無效值的所有文本框的輸出序列。

然後,您可以使用此功能的計算機平均:

var values = ParseValues(new[] { t1, t2, t3, t4 }); 
if (values.Any()) { 
    var average = values.Average(); 
    tavg.Text = average.ToString("00.00"); 
} 

此代碼將計算平均,如果任一或所有的文本框包含有效的數值。

0

請參閱其他答案,討論TryParse或文本框的內容。這只是對這些人的註釋。

FWIW,我有幫助功能,使生活更輕鬆,比如:

double? AsDouble (string str) { 
    double value; 
    if (double.TryParse(str, out value)) 
    return value; 
    } else { 
    return null; 
    } 
} 

然後,它的那麼容易,因爲:

double val = AsDouble(txt.Text) ?? 0; 

(其中0是默認的號碼)

快樂編碼。