0

Я новичок в C#, у меня возникла проблема с TextBox, подтверждающим букву класса (A, B, C, D, F). Прямо сейчас, этот код ниже будет выполнять оператор if, а не оператор else, как он предполагал, если бы я вводил букву графы, точно соответствующую ее состоянию, даже если нижняя обсаженная, а затем верхняя обложка после нажатия кнопки OK. Когда я вводим правильную букву класса, она должна пропустить if и перейти к выражению else, но что-то не так, что я не вижу.Как правильно проверить TextBox на C#?

private void Button_Click(object sender, RoutedEventArgs e) 
    { 

     //automatically convert gradeLetter inputs to uppercase 
     gradeLetter.Text = gradeLetter.Text.ToUpper(); 

     //check if gradeLetter entered is valid 
     if (!string.IsNullOrWhiteSpace(gradeLetter.Text) || gradeLetter.Text != "A" || gradeLetter.Text != "B" || gradeLetter.Text != "C" || gradeLetter.Text != "D" || gradeLetter.Text != "F") 
     { 
      MessageBox.Show("Invalid grade letter or has an empty textbox!", "Caution!", MessageBoxButton.OK); 
     } 
     else 
     { 
      // switch statement to determine which 'gradeLetter' is being used 
      // and assign numerical numbers to 'gpa' to then be calculated. 
      switch (gradeLetter.Text) 
      { 
       case "A": gradeW = 4.0; 
        break; 
       case "B": gradeW = 3.0; 
        break; 
       case "C": gradeW = 2.0; 
        break; 
       case "D": gradeW = 1.0; 
        break; 
       case "F": gradeW = 0.0; 
        break; 
       default: // do nothing 
        break; 
      } 

      double result = (GPA += gradeW); //add to the gpa 
      gCounter++; // increment the gpa entered 
      result /= gCounter; // divide by the number of gpa entered 
      result = Math.Round(result, 2, MidpointRounding.AwayFromZero); //round the result to two decimal places 

      gpa.Text = result.ToString(); //convert result from int to string and display in 'gpa' TextBlock 

      //append the input grade letters to 'gradeEntered' TextBlock 
      gradeEntered.Text += gradeLetter.Text + System.Environment.NewLine; 
     } 
    } 
+0

Вы установили контрольную точку и шагнула через ваши условия, чтобы увидеть * почему * он неожиданно ведет себя? –

+0

Я также новичок в Visual Studio 2013, и я не уверен, как отлаживать его, но показывая, как это будет очень полезно. Я обязательно его использую. – TheAmazingKnight

+2

A [видеообъявление может быть лучшим способом получить эту идею] (http://www.youtube.com/watch?v=C0vDKXIq_9A) - * (Я этого не видел, но это первый результат, когда Я искал «Отладка в Visual Studio», должно хватить * –

ответ

2

Проблема с вашим текущим оператором if заключается в том, что действительный ввод по-прежнему будет считаться недействительным. Если вход «B», он увидит, что это не «A» (что находится в вашем выражении if), что означает, что тогда все критерии будут истинными.

Измените, если заявление на это:

if (string.IsNullOrWhiteSpace(gradeLetter.Text) || !(gradeLetter.Text == "A" || gradeLetter.Text == "B" || gradeLetter.Text == "C" || gradeLetter.Text == "D" || gradeLetter.Text == "F")) 

, который по существу спрашивает «Ваш вход пуст или ваш вход не A, B, C, D или F

4

Вместо того, чтобы использовать много? условия (что делает его немного труднее читать), вы можете использовать список, содержащий допустимые буквы класса:

string gradeLetter = "A"; 

List<string> gradeLetters = new List<string> { "A", "B", "C", "D", "F" }; 

if (!gradeLetters.Contains(gradeLetter)) 
{ 
    // invalid grade letter 
} 

else 
{ 
    // carry on 
} 

Ваш код:

if (!string.IsNullOrWhiteSpace(gradeLetter.Text) || gradeLetter.Text != "A" || gradeLetter.Text != "B" || gradeLetter.Text != "C" || gradeLetter.Text != "D" || gradeLetter.Text != "F") 

Всегда будет правдой. Скажем, класс был B. Он проверит его против gradeLetter.Text != "A", короткое замыкание, и будет истинным, потому что «B»! = «A».

+2

Интересный альтернативный способ сделать это. Спасибо за эффективный код. – TheAmazingKnight

2

Вы можете также использовать словарь подход:

gradeLetter.Text = gradeLetter.Text.ToUpper(); 
IDictionary<string, double> grades = new Dictionary<string, double> 
{ 
    {"A", 4.0}, 
    {"B", 3.0}, 
    {"C", 2.0}, 
    {"D", 1.0}, 
    {"F", 0.0} 
}; 

if (!grades.ContainsKey(gradeLetter.Text)){ 
    MessageBox.Show("Invalid grade letter or has an empty textbox!", "Caution!", MessageBoxButton.OK); 
} 
else{ 
    gradeW = grades[gradeLetter.Text]; 
    // other stuff 
}