2015-09-19 3 views
0

У меня есть простая форма, которая принимает 9 десятичных чисел из 9 текстовых полей, и я поместил некоторую проверку, чтобы пользователи могли вводить только десятичные числа и ничего больше. Теперь проблема, с которой я сталкиваюсь, - установить курсор в текстовом поле, у которого не было десятичного числа после отображения сообщения об ошибке в заявлении try-catch?Поместить курсор в текстовое поле с ошибкой

Вот мой код:

private void btn_Aceptar_Click(object sender, EventArgs e) 
    { 
     POI GPI = new POI(); 
     POI VIM = new POI(); 
     POI ST = new POI(); 

     try 
     { 
      GPI.POI_x = Convert.ToDecimal(txt_GPIx.Text); 
      GPI.POI_y = Convert.ToDecimal(txt_GPIy.Text); 
      GPI.POI_z = Convert.ToDecimal(txt_GPIz.Text); 
      VIM.POI_x = Convert.ToDecimal(txt_VIMx.Text); 
      VIM.POI_y = Convert.ToDecimal(txt_VIMy.Text); 
      VIM.POI_z = Convert.ToDecimal(txt_VIMz.Text); 
      ST.POI_x = Convert.ToDecimal(txt_STx.Text); 
      ST.POI_y = Convert.ToDecimal(txt_STy.Text); 
      ST.POI_z = Convert.ToDecimal(txt_STz.Text); 
     } 
     catch (Exception) 
     { 
      MessageBox.Show("Ingrese solamente números en las variables GPI/VIM/ST", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
//Set the cursor in the first textbox that had no decimals.. 
      return; 
     }  
     Comisurales Comisurales = new Comisurales(); 
     Comisurales.calculo_coord_comisurales(PC, AC, IHP, GPI, VIM, ST);     
    } 

Позвольте мне добавить, что у меня есть функция, чтобы обеспечить пользователю будет ограничен только для ввода знаков после запятой, но я был не в состоянии понять, как избежать «» только или это, например: «1.»

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

private void ValidarDecimal(object sender, KeyPressEventArgs e) 
    { 
     // permitir 0-9, backspace, y decimal 
     if (((e.KeyChar < 48 || e.KeyChar > 57) && e.KeyChar != 8 && e.KeyChar != 46)) 
     { 
      e.Handled = true; 
      return; 
     } 

     // chequear solamente un decimal 
     if (e.KeyChar == 46) 
     { 
      if ((sender as TextBox).Text.IndexOf(e.KeyChar) != -1) 
       e.Handled = true; 
     } 
    } 

Я думаю, у меня есть 2 пути решения моей проблемы. Номер один может найти способ обеспечить, чтобы пользователь никогда не вводил что-то странное в текстовое поле (которое я сделал частично), а номер 2 - использовать try-catch с текущими ограничениями, о которых я упоминал выше, а затем указать пользователю в текстовое поле, в котором есть проблемы, оба приемлемы.

ответ

1

десятичная класс имеет метод TryParse, который может быть использован, чтобы избежать всей этой логики, приводимый ловя исключения (очень дорогой подход с точки зрения производительности)

decimal value; 
if(decimal.TryParse(txt_GPIx.Text, out value)) 
    GPI.POI_x = value; 
else 
{ 
    MessageBox.Show("Invalid decimal value"); 
    txt_GPIx.Focus(); 
} 

Конечно, этот код должен быть повторен для каждый элемент управления в списке, но вы могли бы написать обобщенную функцию как этот

private decimal GetValueAndValidate(Textbox txt, out bool isOK) 
{ 
    isOK = true; 
    decimal value = 0m; 
    if(!decimal.TryParse(txt.Text, out value)) 
    { 
     MessageBox.Show("Invalid decimal value"); 
     txt.Focus(); 
     isOK = false; 
    } 
    return value; 
} 

, а затем использовать следующий подход в коде внутри кнопки мыши

bool isOK = true; 
if(isOK) GPI.POI_x = GetValueAndValidate(txt_GPIx, out isOK); 
if(isOK) GPI.POI_y = GetValueAndValidate(txt_GPIy, out isOK); 
.... and so on for the other fields .... 

Для второй части вашего вопроса найти способ полностью контролировать входную логику непросто. Что происходит, например, если ваш пользователь PASTE имеет недопустимый текст в вашем текстовом поле? Есть очень крайние ситуации, которые требуют больших усилий для правильного кодирования. Гораздо проще оставить свободу ввода пользователю и применять строгую логику, когда вы получите этот ввод.

Смежные вопросы