Winforms калькулятор с# помощь в решении исключения
Я сделал 2 вида ввода в калькуляторе через кнопки на форме и через клавиатуру по нажатию столкнулся с такой проблемой если делать по отдельности вводить числа и операторы с клавиатуры все считается как надо, но если вводить число с кнопки и нажать оператор с клавиатуры выдает исключение.
подскажете как исправить данную проблему
этот метод считает все в калькуляторе
private void Score()
{
if (this.user_action == ' ')
{
return;
}
double second = Convert.ToDouble(this.result_lab.Text);
double res = 0;
this.result_lab2.Text += Convert.ToString(second) + " = ";
switch (this.user_action)
{
case '+': res = this.first_num + second; break;
case '-': res = this.first_num - second; break;
case '*': res = this.first_num * second; break;
case '%': res = this.first_num * second / 100; break;
case '/':
if (second != 0)
{
res = this.first_num / second;
}
else
{
this.result_lab.ForeColor = Color.Red;
this.result_lab2.ForeColor = Color.Red;
MessageBox.Show(this, "Действие запрещено, на 0 делить нельзя!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
this.result_lab2.Text = "";
}
break;
}
this.result_lab.Text = Convert.ToString(res);
private void Button_Key(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Oemcomma)
{
button_comma_Click(sender, e);
}
if (e.KeyCode == Keys.Enter)
{
button_sum_Click(sender, e);
}
if (e.KeyCode == Keys.C)
{
button_C_Click(sender, e);
}
// Проверяем, является ли нажатая клавиша Shift + 8 или Shift + /
if ((e.Shift && e.KeyCode == Keys.D8) || ((e.Shift && e.KeyCode == Keys.OemQuestion) || (e.Shift && e.KeyCode == Keys.D5)))
{
char operatorSymbol = ' ';
switch (e.KeyCode)
{
case Keys.D8:
operatorSymbol = '*';
break;
case Keys.OemQuestion:
operatorSymbol = '/';
break;
case Keys.D5:
operatorSymbol = '%';
break;
}
// Вызываем math_action с символом умножения или деления
math_action(operatorSymbol);
// Добавляем символ умножения или деления в result_lab
this.result_lab.Text += operatorSymbol;
}
else if (e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9)
{
// Получаем номер нажатой клавиши
int num = e.KeyCode - Keys.D0;
// Если начинается ввод нового числа после действия, замените result_lab
if (this.result_lab.Text == "0" || this.again)
{
this.result_lab.Text = num.ToString();
this.again = false;
}
else
{
this.result_lab.Text += num.ToString();
}
// Обновляем first_num только если это первое число или после выполнения операции
if (this.user_action == ' ' || this.again)
{
this.first_num = Convert.ToDouble(this.result_lab.Text);
}
}
// Проверяем, является ли нажатая клавиша оператором
else if (e.KeyCode == Keys.Oemplus || e.KeyCode == Keys.OemMinus || e.KeyCode == Keys.Multiply || e.KeyCode == Keys.Oem2 || e.KeyCode == Keys.Oem5)
{
char operatorSymbol = ' ';
switch (e.KeyCode)
{
case Keys.Oemplus:
operatorSymbol = '+';
break;
case Keys.OemMinus:
operatorSymbol = '-';
break;
case Keys.Multiply:
operatorSymbol = '*';
break;
case Keys.Oem2:
operatorSymbol = '/';
break;
case Keys.Oem5:
operatorSymbol = '%';
break;
}
// Обновляем user_action
this.user_action = operatorSymbol;
// Вызываем math_action с текущим числом
math_action(operatorSymbol);
// Добавляем оператор в result_lab
this.result_lab.Text += operatorSymbol;
}
// Проверяем, является ли нажатая клавиша Backspace
else if (e.KeyCode == Keys.Back)
{
// Удаляем последний символ в result_lab
if (this.result_lab.Text.Length > 0)
{
this.result_lab.Text = this.result_lab.Text.Substring(0, this.result_lab.Text.Length - 1);
this.result_lab2.Text = "";
}
}
}
public void math_action(char action)
{
if (this.dec)
Score();
this.first_num = Convert.ToDouble(this.result_lab.Text); // Складываем первое число с вторым
this.user_action = action;
this.result_lab2.Text = Convert.ToString(this.first_num); //для вверхнего лабеля
switch (action)
{
case '+': this.result_lab2.Text += " + "; break;
case '-': this.result_lab2.Text += " - "; break;
case '*': this.result_lab2.Text += " * "; break;
case '/': this.result_lab2.Text += " / "; break;
case '%': this.result_lab2.Text += " % "; break;
}
this.again = true;
this.dec = true;
}
Ответы (1 шт):
Автор решения: ITBEGINER
→ Ссылка
Вобщем я решил - добавил в метод math_action
if (this.dec)
{
this.second_num = Convert.ToDouble(this.result_lab.Text);
Score();
this.first_num = Convert.ToDouble(this.result_lab.Text);
}
else
{
this.first_num = Convert.ToDouble(this.result_lab.Text);
}
this.user_action = action;
this.result_lab2.Text = Convert.ToString(this.first_num);
и теперь работает как надо плюс упростил нажатие кнопки вызовом метода щас только решаю проблему перезаписывание числа ибо выглядит топорно