2015-02-19 3 views
0

У меня есть эта проблема, когда я запускаю свой код, и это дает мне пустые текстовые поля, и я не уверен, почему. Я отлаживаю его и обнаружил, что number = double.Parse(txtTableAvgTemp.Text); и poolCost = double.Parse(txtTableDollars.Text); оба возвращают NULL. Код предназначен для расчета стоимости отопления рассматриваемого бассейна в соответствии с размером.C# пустые текстовые поля после нажатия

const double poolLengthMin = 5; // min pool length 
    const double poolLengthMax =50; // max pool length 
    const double poolWidthMin = 2; // min pool width 
    const double poolWidthMax = 20; // max pool width 
    const double poolDepthMin = 2; // min pool depth 
    const double poolDepthMax = 4; // max pool depth 

    // variable used in btnCalculate_Click 
    float poolLength; 
    float poolWidth; 
    float poolDepth; 
    float SurfaceArea = 0; 
    float Volume = 0; 
    const int poolSize = 0; 
    const int smallPool = 500000 ; 
    const int mediumPool = 1500000; 
    const double poolTemp = 1.5; 
    double poolDegreesMin = 5; 
    double poolDegreesMax = 25; 
    double number; 
    double costToHeatPool; 
    double heatingVolume; 
    double poolDegrees = 5; 


    /* validation statements for pool 
    * length, width and depth 
    */ 
    bool ValidPoolLength(double poolLength) 
    { 
     if (poolLength >= poolLengthMin && poolLength <= poolLengthMax) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
    bool ValidPoolWidth(double poolWidth) 
    { 
     if (poolWidth >= poolWidthMin && poolWidth <= poolWidthMax) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
    bool ValidPoolDepth(double poolDepth) 
    { 
     if(poolDepth >= poolDepthMin && poolDepth <= poolDepthMax) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
    // end of validation statements 

    private void lblCategory_Click(object sender, EventArgs e) 
    { 

    } 

    private void btnCalculate_Click(object sender, EventArgs e) 
    { // convert variable to float from double from string 
     poolLength = float.Parse(txtLength.Text); 
     poolWidth = float.Parse(txtWidth.Text); 
     poolDepth = float.Parse(txtAvgDepth.Text); 


     //clear string 
     txtVolume.Clear(); 
     txtSurfaceArea.Clear(); 
     txtTableDollars.Clear(); 


     // error massages for pool length 
     //pool width and pool depth 

    if (!(ValidPoolLength(poolLength))) 
    { 
     MessageBox.Show("Length measurement is invalid \r\n Please enter a value between : " + poolLengthMin + " and " + poolLengthMax, "Pool Lenght Invalid" , MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
      return; 
    } 
    if (!(ValidPoolWidth(poolWidth))) 
    { 
     MessageBox.Show("Width measurment is invalid \r\n Please enter a value between : " + poolWidthMin + " and " + poolWidthMax, "Pool Width Invalid", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
     return; 
    } 
    if (!(ValidPoolDepth(poolDepth))) 
    { 
     MessageBox.Show("Pool Depth is invalid \r\n Please enter a value between : " + poolDepthMin + " and " + poolDepthMax, "Pool Depth Invalid", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
     return; 
    } 
     // caclulate surface area and show in txtSurfaceArea 

     SurfaceArea = poolLength * poolWidth; 
     txtSurfaceArea.Text += SurfaceArea; 

     //calculate pool volume and show in txtVolume 
     Volume = poolLength * poolWidth * poolDepth * 1000; 
     txtVolume.Text += Volume; 


     //calculate size of pool Small, Medium or large 
     //and show in lblcategory 

    Volume = float.Parse(txtVolume.Text); 
    if (poolSize <= smallPool && smallPool >= Volume) 
    { 
     lblCategory.Text = "Pool Category: Small"; 
    } 
    else if (poolSize <= mediumPool && mediumPool >= Volume) 
    { 

     lblCategory.Text = "Pool Category: Medium"; 
    } 
    else 
    { 
     lblCategory.Text = "Pool Category: Large"; 
    } 


     //cost to heat the pool to 25 degrees 


    while (poolTemp >= poolDegrees && poolTemp < poolDegrees) 
    { 
     number = poolDegrees + poolTemp; 
     txtTableAvgTemp.Text += number.ToString() + "\r\n"; 
     poolDegrees += poolTemp; 

     //variable for costing out heating of pool 

     double poolCost = costToHeatPool; 
     heatingVolume = float.Parse(txtVolume.Text); 
     costToHeatPool = float.Parse(txtVolume.Text); 
     poolCost = double.Parse(txtTableDollars.Text);//empty ? 
     number = double.Parse(txtTableAvgTemp.Text);//empty ? 
     poolCost = (Math.Truncate(poolCost)); 


      //formula for costing of heating to pool 
      costToHeatPool = (25 - number) * heatingVolume/32500; 
      txtTableDollars.Text += poolCost + "\r\n"; 
    } 
} 

Я дал вам весь мой код, поскольку я не уверен, где я ошибся. Я попробовал poolDegreesMin и poolDegreesMax.

+0

Вы можете добавить пример содержимого текстовых полей? –

+0

Вы уверены, что видели 'double.Parse (txtTableAvgTemp.Text)' return 'null'? Он возвращает 'double', а double не может быть null. –

+0

содержание текстового окна averg temp - это временная температура воды, начинающаяся с 5 градусов и добавляющая от 1,5 до 25 градусов, а текстовое поле в месяц вырабатывает затраты на нагрев бассейна с помощью costToHeatPool = (25 - номер) * heatingVolume/32500;» надеюсь, что это поможет вам войти в ширину, длину и глубину бассейна, а затем площадь поверхности какалюта и объем воды. – warwick

ответ

2

Я просто вижу некоторые проблемы с разбором своих двенадцати. Вы разбираете текст txtTableAvgTemp.Text. Этот текст распространяется для каждого цикла While с новой линией температуры:

txtTableAvgTemp.Text += number.ToString() + "\r\n";

Это никогда не разобрать.

Далее в первом цикле текст пуст ("", который не является null). Это также вызовет исключение FormatException.

Инициализируйте текстовое поле сначала 0. И не добавляйте новые строки в текстовое поле, если вы хотите проанализировать их позже. Вы должны использовать временные двойные поля для хранения последних значений. Тогда нет необходимости разбирать все время.

// init with 0 
txtTableDollars.Text = 0; 
txtTableAvgTemp.Text = 0; 
double currentCost = 0; 

// do them outside, no need to do it on every loop 
float heatingVolume = float.Parse(txtVolume.Text); 

// working while 
while (poolDegrees >= 3.5 && poolDegrees < 23) 
{ 
    poolDegrees += poolTemp; 

    double costToHeatPool = (25 - poolDegrees) * heatingVolume/32500; 

    currentCost += costToHeatPool; 

    txtTableAvgTemp.Text += poolDegrees + System.Environment.NewLine; 
    txtTableDollars.Text += currentCost + System.Environment.NewLine; 
} 

Дополнительная точка: Я не знаю точно, но это в то время как петля здесь выглядит действительно подозрительно

while (poolTemp >= poolDegrees && poolTemp < poolDegrees) {/*...*/} 

Для меня это выглядит как while(false). Это предназначено? этот цикл не должен быть выполнен ...

+0

no while цикл должен быть выполнен, чтобы дать мне aveg temp и стоимость. Мне нужно использовать синтаксический анализ, то, что вызвано в моем назначении, но я могу попробовать это. Я попытался инициализировать оба txtboxes с 0, но не работал. Я попробую вашу идею и посмотрю, смогу ли я это сделать. Все еще изучая – warwick

+0

2 переменные в while loop: poolTemp и poolDegrees, где poolTemp является 'const double 1.5'. poolDegrees либо меньше, равен или больше. poolDegrees тоже начинает со значения: 5. Поэтому он всегда больше, чем poolTemp. Но тогда первая часть из while будет всегда ложным ('poolTemp> = poolDegrees') И цикл while никогда не выполняется ... Если я что-то пропущу, скажите, пожалуйста ... – AnZoll

+0

@ Andreas да, что вы говорите так верно, я просто так запутался, как сделать этот идентификатор. '(poolDegrees> = 3.5 && poolDegrees <23) ', но он не будет разбираться. Поэтому я попросил инструктора о помощи, и он сказал, что у меня неправильный пул. – warwick

1

Ну, в начале вашего кода есть строка кода:

txtTableDollars.Clear(); 

это очищает текстовое поле, так что позже, когда вы используете этот текст, очевидно, пусто:

poolCost = double.Parse(txtTableDollars.Text); 

И далее в том же цикле - вы присваиваете его как

txtTableDollars.Text += poolCost + "\r\n"; 

поэтому, если ваш цикл будет выполнен более одного раза, вы получите какой-то странный результат (или исключение) при его повторном анализе.

Похоже, вы должны разделить свои вычисления на визуализацию. Разбирайте свой ввод один раз и используйте номера для вычисления, не повторяйте текстовые значения снова.