将光标放置在有错误的文本框上



我有一个简单的表单,它从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;
      }
  }
我想我有两种方法来解决我的问题。第一种是找到一种方法来确保用户永远不会在文本框中输入奇怪的东西(我已经做了部分),第二种是使用try-catch来处理我上面提到的当前限制,然后将用户指向有问题的文本框,这两种方法都是可以接受的。

Decimal类有一个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 ....

对于你问题的第二部分,找到一种完全控制输入逻辑的方法并不容易。例如,如果用户在文本框中粘贴无效文本,会发生什么情况?在一些非常极端的情况下,需要花费大量的精力才能正确地编写代码。将输入的自由留给用户并在获得输入时应用严格的逻辑要容易得多。

最新更新