Почему моя форма закрывается, когда я перемещаю вкладку туда и обратно из текстового поля - PullRequest
0 голосов
/ 08 декабря 2010

У меня в коде события TextBox следующий код:

private void txtAmount_Leave(object sender, EventArgs e)
{
   int x = Convert.ToInt32(txtAmount.Text);
   double res = (double)x / 100;
   txtAmount.Text = "$" + res.ToString();
}

Но если вернуться к предыдущему элементу управления, нажав Shift + Tab и снова вернувшись к тому же текстовому полю, а затем попытаться перейти к другому, форма автоматически закроется. Почему это происходит?

Ответы [ 6 ]

4 голосов
/ 08 декабря 2010

При первом выходе из этого текстового поля его содержимое будет изменено на «$ 123» (например). Во второй раз, когда вы уйдете, попытка преобразовать это в int вызовет исключение.

Вы можете использовать перегрузку TryParse , которая принимает NumberStyle, что-то вроде этого, при условии, что ваша цель - просто показать значение валюты без десятичных знаков.

double number;

if (double.TryParse(txtAmount.Text, NumberStyles.Currency, CultureInfo.CurrentUICulture, out number))
{
    txtAmount.Text = number.ToString("C0");
}
else
{
    MessageBox.Show("Could not convert.");
}

Прочитав комментарий Доната к его ответу, я не уверен, какова ваша цель. Если вы хотите обрезать центы, но по-прежнему показывать «.00», вы можете сделать это:

txtAmount.Text = ((int)number).ToString("C");

Или сделайте так, чтобы округлилось:

txtAmount.Text = (Convert.ToInt32(number)).ToString("C");

Если это не поможет, пожалуйста, уточните и сообщите нам, чего вы пытаетесь достичь.

4 голосов
/ 08 декабря 2010

Вызов Convert.ToInt32(), вероятно, вызывает исключение, вероятно, из-за невозможности преобразовать строку в вашем TextBox в целое число.Convert.ToInt32() может выдавать следующие исключения (описания из MSDN ):

  • FormatException - значение не состоит из необязательного знака, за которым следует последовательность цифр (от 0 до9).
  • OverflowException - значение представляет собой число, которое меньше Int32.MinValue или больше Int32.MaxValue.

Вероятно, FormatException выдается приоставьте TextBox после добавления $ к вашей строке или после ввода любых нечисловых символов (букв и т. д.).Чтобы исправить это, у вас есть несколько вариантов:

  • Добавить try / catch блок вокруг кода для обработки любых исключений.
  • Используйте Int32.TryParse() вместо Convert.ToInt32().
  • Добавьте код, который будет препятствовать вводу нечисловых символов в ваш TextBox

Вотулучшенная версия вашего обработчика событий:

private void txtAmount_Leave(object sender, EventArgs e)
{
    string toParse = txtAmount.Text.TrimStart('$');

    int parsed;
    if (Int32.TryParse(toParse, out parsed))
    {
        double res = (double)parsed / 100;
        txtAmount.Text = "$" + res.ToString();
    }
}
0 голосов
/ 09 декабря 2010

Я получил решение

      private void txtAmount_Leave(object sender, EventArgs e)
    {
        string strAmnt = string.Empty;
        strAmnt = txtAmount.Text;
        if (strAmnt.Contains(".") && !strAmnt.Contains("$"))
        {

            txtAmount.Text = "$" + strAmnt;
            while (txtAmount.Text.Length - txtAmount.Text.IndexOf(".") <= 2)
            {
                txtAmount.Text += "0";
            }
        }
        else
            if (strAmnt.Contains("$") && !strAmnt.Contains("."))
            {
                Int64 amnt = 0;
                strAmnt = strAmnt.Replace("$", "");
                try
                {
                    amnt = Convert.ToInt64(strAmnt);
                    double amt = (double)amnt / 100;
                    txtAmount.Text = "$" + amt.ToString();
                }
                catch (FormatException ie)
                {
                    MessageBox.Show("Invalid Format");
                }
            }
            else
                if (!strAmnt.Contains(".") && !strAmnt.Contains("$"))
                {
                    try
                    {
                        int x = Convert.ToInt32(txtAmount.Text);
                        double res = (double)x / 100;
                        txtAmount.Text = "$" + res.ToString();
                        while (txtAmount.Text.Length - txtAmount.Text.IndexOf(".") <= 2)
                        {
                            txtAmount.Text += "0";
                        }
                    }
                    catch (FormatException ie)
                    {
                        MessageBox.Show("InvalidFormat");
                    }
                }
        while (txtAmount.Text.Length - txtAmount.Text.IndexOf(".") <= 2)
        {
            txtAmount.Text += "0";
        }
    }
0 голосов
/ 08 декабря 2010

Вы можете изменить свой код, чтобы удалить $, прежде чем работать с номером:

private void txtAmount_Leave(object sender, EventArgs e)
{
   int x = 0;
   int.TryParse(txtAmount.Text.Replace("$", string.Empty), out x);
   double res = (double)x / 100;
   txtAmount.Text = "$" + res.ToString();
}
0 голосов
/ 08 декабря 2010

Проверьте txtAmount.Text на наличие знака $, прежде чем пытаться преобразовать его в int.Если присутствует знак $, удалите его и преобразуйте остальные входные данные в int.

Кроме того, вы можете использовать метод Int32.TryParse , так как этопоможет вам выяснить, можно ли преобразовать введенный текст в int или нет.

0 голосов
/ 08 декабря 2010

Попробуйте это:

private void txtAmount_Leave(object sender, EventArgs e)
{
    if (!String.IsNullOrEmpty(txtAmount.Text) && txtAmount.Text.StartsWith("$"))
        txtAmount.Text = txtAmount.Text.Substring(1);

    int x = Convert.ToInt32(txtAmount.Text);
    double res = (double)x / 100;

    txtAmount.Text = "$" + res.ToString();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...