none
comenzar con dos caracteres. RRS feed

  • Pregunta

  • Estoy tomando la lectura de un scaner en un textbox pero necesito hacer una función que solo permita los escaneos que comiencen con "3S", de lo contrario me diga error. 
    miércoles, 23 de mayo de 2018 20:33

Respuestas

  • Te recomiendo pongas un punto de ruptura al inicio del método y ejecutar paso a paso la depuración. 


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 24 de mayo de 2018 8:55
    Moderador
  • yo modificaría tu método para devolver un bool si se produce la regla de negocio que indicas. También evitaría pasar un TextBox como parámetro ya que eso hace que modifiques el valor de su propiedad Text al ser un objeto que se pasa como referencia a tu método.

    private bool opcion1(string txt)
    {
        bool resultado = false;
        string a = Properties.Settings.Default.op11;
        string b = Properties.Settings.Default.op12;
    
        if (!string.IsNullOrWhiteSpace(txt))
        {
            if (txt.Length >= 2)
            {
                if (s.StartsWith(a) || s.StartsWith(b))
                {
                    resultado = true; // dejaremos pasar
                }
            }
        }
    
        return resultado;
    }

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 24 de mayo de 2018 14:19
    Moderador

Todas las respuestas

  • Hola puedes usar el método StartsWith para ver si una cadena empieza por unos determinados caracteres.

    string lectura = "3S54568";
    if(lectura.StartsWith("3S))
    {
      // hacer lo que sea
    } 


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    miércoles, 23 de mayo de 2018 22:04
    Moderador
  • De esta manera lo hago pero los que no tienen "3S" siempre los acepta.
    miércoles, 23 de mayo de 2018 22:17
  • Puedes poner un caso de ejemplo? Puedes indicar parte de tu código? 

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    miércoles, 23 de mayo de 2018 22:32
    Moderador
  •  

    Utilizo este metodo el cual solo lo declaro dentro del evento textchanged del textbox1 en este caso.

    string a y string b son este caso "3S" y "3s", con los cuales determino que con ellos deben empezar el texto.

    El valor me lo toma pero me esta quitando el "3S", necesito todo el valor.

    Este es el codigo:

    private void opcion1(TextBox txt)
    {
        string s = txt.Text;
        string a = Properties.Settings.Default.op11;
        string b = Properties.Settings.Default.op12;
    
        if (s != "")
        {
            if (s.Length >= 2)
            {
                if (s.startswith(a) || s.startswith(b))
                {
                    if (s.Length > 2)
                    {
                        //MessageBox.Show(s.Length.ToString());
    
                    }
                    else
                        s = "";
                }
                txt.Text = s;
            }
        }
    }

                         

    miércoles, 23 de mayo de 2018 23:08
  • Te recomiendo pongas un punto de ruptura al inicio del método y ejecutar paso a paso la depuración. 


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 24 de mayo de 2018 8:55
    Moderador
  • Tu problema está aquí:

      if (s.Length > 2)
      {
           //MessageBox.Show(s.Length.ToString());
    
      }
      else
           s = ""; // si la cadena no es mayor a dos caracteres ponerla en blanco (3S y 3s cumplen esa condición) por lo que acabas por borrarla.

    Se podria solucionar de esta manera:

    private void textBox1_TextChanged(object sender, EventArgs e) { string s = textBox1.Text; string a = "3s"; // if (s != "") este if sale sobrando si la cadena está vacia entonces tiene una logitud 0 // por lo que la condición subsecuente nunca se cumple. if (s.Length >= 2) {

    // si la cadena NO empieza con el prefijo borrar su contenido. if (!s.ToLower().StartsWith(a.ToLower()))// si solo se va a validar la diferencia entre mayuscula y minuscula veo mas comodo comparar los valores convertidos s = ""; } textBox1.Text = s; }


    Saludos.




    jueves, 24 de mayo de 2018 13:38
  • Cual seria la solucion en este caso?

    jueves, 24 de mayo de 2018 13:40
  • Edité la respuesta anterior con una posible solución. 

    Saludos.

    jueves, 24 de mayo de 2018 13:53
  • yo modificaría tu método para devolver un bool si se produce la regla de negocio que indicas. También evitaría pasar un TextBox como parámetro ya que eso hace que modifiques el valor de su propiedad Text al ser un objeto que se pasa como referencia a tu método.

    private bool opcion1(string txt)
    {
        bool resultado = false;
        string a = Properties.Settings.Default.op11;
        string b = Properties.Settings.Default.op12;
    
        if (!string.IsNullOrWhiteSpace(txt))
        {
            if (txt.Length >= 2)
            {
                if (s.StartsWith(a) || s.StartsWith(b))
                {
                    resultado = true; // dejaremos pasar
                }
            }
        }
    
        return resultado;
    }

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 24 de mayo de 2018 14:19
    Moderador
  • Asi es como tengo el codigo y me funciona bien porque extraigo "3S" cuando lleva este mismo, el detalle es que lee otros valores que no lleven "3S", debo aplicar una condicion que si es diferente de "3S" limpie el campo.

    Private void opcion1(string txt) 
    
    string s = txt.Text;
            string a = "3S";
            string b = "3s";
    
            if (s != "")
            {
                if (s.Length >= 2)
                {
                    if (s.StartsWith(a) || s.StartsWith(b))
                    {
                        if (s.Length > 2)
                        {
                            //MessageBox.Show(s.Length.ToString());
                            s = s.Substring(2);
                        }
                        else
                            s = "";
                    }
    
                    txt.Text = s;
                }
            }
    jueves, 24 de mayo de 2018 18:09
  • Si entendí bien la pregunta Te acepta los que no empiezan con "3S"?


    if (s.Length > 2)
    {                        
         s = s.Substring(2);
    }

    De igual manera lo que estas haciendo alli es solo dejar el "3S" y poniendolo en el textbox.

    Eso retornaría:

    Entrada -> "3s999999"
    Salida -> "3s"
    Entrada -> "3s111111"
    Salida -> "3s"
    Entrada -> "1s999999"
    Salida -> "1s999999"

    Vamos a analisar lo que tu código actualmente hace voy a saltar la primera validación.

    Si la cadena es de dos o mas digitos e Inicia con "3s" o "3S" y es mayor que dos caracteres entonces asigna los primeros 2 caracteres al textbox, si es de dos caracteres(la unica opcion posible dada la primera condicion) vacia el textbox.

    Si te das cuenta en tu logica no hay ningún tratamiento para las cadenas que no inician con "3s" y "3S".

    Por otro lado si los escaneos se hacen con un codigo de barras, convendria limpiar el textbox cuando haya un error.

    Hay que dejar en claro el comportamiento que deseas lograr, si lo que deseas lograr es:

    Cuando un usuario introduzca un valor que no comienze por 3s mostrar un mensaje de error y borrar el contenido del textbox entonces se haría como lo propone Sergio Parra.

    Te pongo un ejemplo.

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
           if(!ValidarCodigo(textBox1.Text)){ // si no inicia con 3s
               textBox1.Text = ""; // borrar el contenido del textBox
               MessageBox.Show("Entrada no valida"); //mostar error al usuario
           }
    }
    
    private bool ValidarCodigo(string codigo)
    {
          var prefijo = "3s"; //pongo el prefijo aparte porque quizas lo leas de otro lado.
          return codigo.ToLower.StartsWith(prefijo.ToLower());
    }

    Saludos.

    jueves, 24 de mayo de 2018 20:21
  • Ahí el único detalle es que debe pasar un filtro, si tiene "3S" lo acepta como correcto y luego le quita el "3S" para dejar lo restante de la lectura. Solo estaria pendiente que una vez lo tome como correcto le quite el "3S".

    jueves, 24 de mayo de 2018 20:40
  • En ese caso entonces podria quedar:

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
           if(!ValidarCodigo(textBox1.Text)){ // si no inicia con 3s
               textBox1.Text = ""; // borrar el contenido del textBox
               MessageBox.Show("Entrada no valida"); //mostar error al usuario
           }else
    textBox1.Text = textBox1.Text.Substring(2); //nota que para poder pasar la validación ValidarCodigo la longitud del campo es de 2 o mas caracteres por lo que omito esa comprobación } private bool ValidarCodigo(string codigo) { var prefijo = "3s"; //pongo el prefijo aparte porque quizas lo leas de otro lado. return codigo.ToLower.StartsWith(prefijo.ToLower()); }

    Y una disculpa en el analisis anterior me confundí con el substring. Tienes toda la razón toma del segundo carácter en adelante.

    Nota: Decidí probar el código para ver el comportamiento y hay un comportamiento indeseado que note y es que al establecer el valor del textbox en "textBox1.Text = textBox1.Text.Substring(2);" se dispara nuevamente el evento TextChanged por lo que el nuevo valor ya no es válido lanzando el error y borrando el campo. En este caso se me ocurren 2 cosas, algunos scanners "presionan" la tecla enter tas la lectura, de alli podrias agarrar el evento keyup y realizar la validacion cuando la tecla presionada sea enter. La otra opción es guardar el valor sin el prefijo en un campo y no modificar tu textbox y al momento de procesar tu información tomar el campo y no el valor del textbox.

    Saludos.


    • Editado Yamiel Dash jueves, 24 de mayo de 2018 22:04 Prueba de solución.
    jueves, 24 de mayo de 2018 21:47