Как правильно проверить TextBox в C#?
Я новичок в C#, у меня проблема с проверкой правильности букв TextBox (A, B, C, D, F). Прямо сейчас этот код ниже будет выполнять оператор if, а не оператор else, как предполагалось, если бы я вводил букву оценки, точно соответствующую ее условию, даже если после нажатия кнопки ОК регистр нижний и верхний регистр. Когда я ввожу правильную букву оценки, она должна пропустить оператор if и перейти к выражению else, но что-то не так, чего я не вижу.
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;
}
}
3 ответа
Проблема с вашим текущим оператором if в том, что действительный ввод все равно будет считаться недействительным. Если вход "B", он увидит, что это не "A" (что есть в вашем операторе if), что означает, что тогда весь критерий верен.
Измените свое заявление 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?
Вместо использования многих условий (что затрудняет чтение), вы можете использовать Список, содержащий действительные буквы оценки:
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".
Вы также можете использовать словарный подход:
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
}