C # - правильная проверка для целых чисел - PullRequest
4 голосов
/ 17 марта 2012

Я сейчас строю свой проект, используя формы Windows, и натолкнулся на небольшую «проблему».

У меня есть пользователь, который вводит час, который хранится как int.Я хочу предоставить подробный отзыв пользователю, чтобы он точно знал, что он сделал неправильно, если он вызовет ошибку.

Если значение не указано, генерируется исключение формата.Если дано что-то кроме целого числа, генерируется исключение формата.

Это означает, что я не могу напрямую сказать пользователю, что новый элемент не может быть добавлен из-за ЛИБО 1) никакого значения или 2) не целое число какони оба используют одно и то же исключение.

Как я могу решить эту проблему и какое решение будет наилучшим?

Большое спасибо.

Ответы [ 5 ]

2 голосов
/ 17 марта 2012

Используйте метод Int32.TryParse и проверьте возвращаемое значение. Вы можете просто проверить отсутствие введенного значения перед вызовом TryParse.

Вот пример использования из MSDN:

  int number;
  bool result = Int32.TryParse(value, out number);
  if (result)
  {
     Console.WriteLine("Converted '{0}' to {1}.", value, number);         
  }
  else
  {
     if (value == null) value = ""; 
     Console.WriteLine("Attempted conversion of '{0}' failed.", value);
  }
1 голос
/ 17 марта 2012

Это хорошо поддерживается в Winforms. Используйте событие Validating для проверки записи, компонент ErrorProvider - для сообщения об ошибке. Пример обработчика события:

    private void textBox1_Validating(object sender, CancelEventArgs e) {
        int hour;
        e.Cancel = true;
        if (textBox1.Text.Length == 0) errorProvider1.SetError(textBox1, "Can't be empty");
        else if (!int.TryParse(textBox1.Text, out hour)) errorProvider1.SetError(textBox1, "Not a number");
        else if (hour < 1) errorProvider1.SetError(textBox1, "Hour too small");
        else if (hour > 24) errorProvider1.SetError(textBox1, "Hour too large");
        else {
            e.Cancel = false;
            errorProvider1.SetError(textBox1, "");
        }
    }

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

    private void OKButton_Click(object sender, EventArgs e) {
        if (ValidateChildren()) this.DialogResult = DialogResult.OK;
    }
1 голос
/ 17 марта 2012

пример кода, связанный с вашим вопросом; В частности, обратите внимание на ValidateData:

// called from ok button click or similar event
private void Accept()
{
   if (!ValidateData())
      return;

   SaveData();
   DialogResult = DialogResult.Ok;
   Dispose();
}

private bool ValidateData()
{
   int val;

   if (string.IsNullOrEmpty(mTextBox.Text))
      return FailValidation("Value can not be empty.", mTextBox);

   if (!int.TryParse(mTextBox.Text, out val))
       return FailValidation("Value was not an integer.", mTextBox);

   return true;
}

// do something with the value if you need
private void SaveData()
{       
}

// post a message to the user, and highlight the problematic control
// always evaluates to false
private bool FailValidation(string pMessage, Control pControl)
{
     if (pControl != null)
     {
        pControl.Focus();
        TextBox textBox = pControl as TextBox;
        if (textBox != null)
           textBox.SelectAll();
     }

     AlertBox(pMessage);
     return false;
}

// quick alert message method
private void AlertBox(string pMessage)
{
   return MessageBox.Show
   (
      pMessage,          
      Application.ProductName,
      MessageBoxButtons.OK,
      MessageBoxIcon.Exclamation,
      MessageBoxDefaultButton.Button1
   );
}
1 голос
/ 17 марта 2012

Если я могу предложить возможное альтернативное решение ... Лучшая проверка в первую очередь - предотвращение неверного ввода.Можете ли вы ограничить значения, которые пользователь может выбрать, используя элемент управления, такой как указатель времени или раскрывающийся список?Раскрывающийся список будет по-прежнему удобен для пользователей, использующих клавиатуру, и для тех, кто предпочитает мышь, его немного прощеПобеды для всех.

1 голос
/ 17 марта 2012

Используйте int.TryParse для проверки формата, а затем, в случае успеха, проверьте, находится ли целое число в допустимом диапазоне. Используйте String.IsNulOrEmpty, чтобы проверить наличие пустой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...