none
Detener Avance de Funcion RRS feed

  • Pregunta

  • Buenas tardes

    Tengo una validación en un TextBox donde si el campo esta vacio me arroja un error, y no debe de avanzar hasta que no halla algún carácter, de lo contrario avanza y hecha a andar una función, como le puedo hacer

    esto es lo que uso para el botón

    if ((int)e.KeyChar == (int)Keys.Enter)
    {
     if (txtcodigo.Text == "") { MessageBox.Show("Necesario Especificar un Codigo", "Error de Captura de Codigo"); txtcodigo.Focus(); }
     else
     {
      try
      {
       encuentraprecio();
    }
    finally { }
    }

    como puedo hacer que no avance hasta que el campo este lleno,?

    Espero me puedan apoyar

    Saludos

    lunes, 29 de agosto de 2016 17:39

Respuestas

  • Hola Ricardo de Jesus Castro

    Si usted tiene un botón Aceptar en el formulario, puede ser mejor idea mantener deshabilitado ése botón. La habilitación sería cuando en el evento TextChanged del textBox se compruebe algún tipo de contenido.

    Lo sugiero porque en este tipo de situaciones el uso de un cuadro de diálogo puede ser bastante molesto.

    En el evento Form_Load

    private void Form1_Load(object sender, EventArgs e)
    {
        button1.Enabled = false; 
    }

    En el evento TextChanged

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        if (textBox1.Text.Trim().Length > 0) 
            button1.Enabled = true;
        else
            button1.Enabled = false;
    }

    Saludos,


    Miguel Torres




    lunes, 29 de agosto de 2016 18:23
  • hola

    para eso usas el evento Validating no el keypress

    public void TextBox1_Validating(...){
    
       if(TextBox1.Text == ""){
               e.Cancel = true;      
               errorProvider1.SetError(textBox1, "El campo es obligatorio");
       }
    
    }

    define un control ErrorProvider en el form ya que no puede usar el MessageBox.Show()

    al cancelar el evento no se podra quitar el foco del textbox

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 29 de agosto de 2016 18:24
  • Ricardo de Jesus Castro

    En relación a la función encuentraprecio(), ¿esta requiere el valor del textBox?. Pregunto porque no se observa que tome ese valor como argumento.

    Saludos, 


    Miguel Torres



    lunes, 29 de agosto de 2016 18:32
  • Hola Ricardo de Jesus Castro,

    [-] ... esa función es para buscar en una tabla de sql, lo que quiero es que no avance hasta que tenga la longitud correcta o hasta que no encuentre en la tabla.

    La longitud que se debe a ingresar en el TextBox es fija ? Es decir (un ejemplo el dni es longitud 8 en mi país) siempre debe tener esa longitud o puede variar según el caso.

    Hasta que no encuentre en la BD : Si el valor que deseas ingresar NO EXISTE en la BD si puedes seguir, es así ?

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    lunes, 29 de agosto de 2016 20:23
  • Ricardo de Jesus Castro

    Revise la última respuesta, allí está incluido el código para mostrar la información en el dataGridView. Aquí se lo dejo. El código lo he probado y ha funcionado.

    private void textBox1_Validating_1(object sender, CancelEventArgs e)
            {
                // Esta parte especifica que la longitud no puede ser cero (0) 
                if (textBox1.Text.Trim().Length == 0)
                {
                    e.Cancel = true;
                    //errorProvider1.SetError(textBox1, "Se requiere un valor");
                }
    
                // En esta parte puede verificar si la tabla tiene filas.
                DataTable tabla = busca1();
    
                if (tabla.Rows.Count != 0)
                {
                    dataGridView1.DataSource = tabla;
                    e.Cancel = false;
                }
                else
                {
                    e.Cancel = true;
                }
            }
    Saludos,

    Saludos,


    ___________________ Miguel Torres

    martes, 30 de agosto de 2016 19:27
  • asi fue como quedo funcionando al ultimo private void txtcodigo_KeyPress(object sender, KeyPressEventArgs e) { TextBox txt = (TextBox)sender; if (e.KeyChar == (char)Keys.Enter) { if (txt.Text.Trim() == string.Empty) { MessageBox.Show("Debe ingresar un código."); txt.Focus(); return; } else { encuentraprecio(); } } } System.Data.DataTable busca1() { txtcodigo.Text = txtcodigo.Text.Replace("\r\n", ""); string sql = "select precio, articulo from productos_venta where codigo='" + txtcodigo.Text + "'"; SqlDataAdapter da = new SqlDataAdapter(sql, ConectionBDD()); DataTable dt = new DataTable(); da.Fill(dt); return dt; } gracias Saludos
    martes, 30 de agosto de 2016 20:25
  • Hola Ricardo de Jesus Castro

    Puede usar el evento Validating. Note que debe agregar un control ErrorProvider al formulario.

            private void textBox1_Validating(object sender, System.ComponentModel.CancelEventArgs e)
            {
                // Esta parte especifica que la longitud no puede ser cero (0) 
                if (textBox1.Text.Trim().Length == 0)
                {
                    e.Cancel = true;
                    errorProvider1.SetError(textBox1, "Se requiere un valor");
                }
    
                // En esta parte puede verificar el valor en la base de datos.
                bool Encontrado = false;
                // Si el valor es encontrado, establezca: Encontrado = true;
    
                if (Encontrado == true)
                    e.Cancel = false;
                else
                    e.Cancel = true;
    
            }


    Luego en el evento Validate agrega la funcion:

    private void textBox1_Validated(object sender, EventArgs e)
    {
         encuentraprecio();   
    }

    Si le ha servido no olvide votar y establecer como respuestas.

    Saludos,


    Miguel Torres



    lunes, 29 de agosto de 2016 19:29
  • Ricardo de Jesus Castro

    En el Cuadro de Herramientas (ToolBox), bien sea en la Pestaña Componentes (Components) o en la pestaña Todos los Formularios de Windows (All Windows Forms, en la misma lista de controles donde está TextBox, ComboBox, etc).

    Lo agrega al formulario como cualquier otro control y lo utiliza como se muestra en el código de ejemplo.

    Saludos, 


    Miguel Torres




    lunes, 29 de agosto de 2016 19:38
  • asi lo estoy haciendo:

    private void txtcodigo_KeyPress(object sender, KeyPressEventArgs e)
    {
    TextBox txtcodigo = (TextBox)sender;
    if ((int)e.KeyChar == (int)Keys.Enter)
    {
    if (txtcodigo.Text.Length == 0) { MessageBox.Show("Necesario Especificar un Codigo", "Error de Captura de Codigo"); txtcodigo.Focus();}
    else
    {
    try
    {
    encuentraprecio(); <------Aqui busca en la base de datos
    lblarticulo.Text = "Articulo: " + dataGridView1.Rows[0].Cells[1].Value.ToString(); <----Con esto se trae el resultado de la busqueda de encuentraprecio para agregarse a otra gridview
    y es alli donde marca el error cuando no cuentra nada
    lblarticulo.Visible = true;
    }
    finally { }
    }
    }
    }

    lunes, 29 de agosto de 2016 20:42
  • Hola Ricardo de Jesus Castro

    --me aparece el detalle que te pongo en el código, sobre el operador == nose puede aplicar en tipo void y bool

    Buscar1, devuelve una DataTable y no un valor Boolean (True o False), por lo tanto no se puede utilizar de esa forma.

    Le recomiendo utilizar buscar1 el evento Validating de la siguiente forma: 

    private void textBox1_Validating(object sender, CancelEventArgs e)
    {
         // Esta parte especifica que la longitud no puede ser cero (0) 
          if (textBox1.Text.Trim().Length == 0)
           {
               e.Cancel = true;
               // Puede utilizar ErrorProvider 
           }
    
          // En esta parte puede verificar si la tabla tiene filas.
           if (busca1().Rows.Count != 0)
               e.Cancel = false;
           else
               e.Cancel = true;
    }

    Saludos,


    Miguel Torres


    martes, 30 de agosto de 2016 18:59

Todas las respuestas

  • Hola Ricardo de Jesus Castro

    Si usted tiene un botón Aceptar en el formulario, puede ser mejor idea mantener deshabilitado ése botón. La habilitación sería cuando en el evento TextChanged del textBox se compruebe algún tipo de contenido.

    Lo sugiero porque en este tipo de situaciones el uso de un cuadro de diálogo puede ser bastante molesto.

    En el evento Form_Load

    private void Form1_Load(object sender, EventArgs e)
    {
        button1.Enabled = false; 
    }

    En el evento TextChanged

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        if (textBox1.Text.Trim().Length > 0) 
            button1.Enabled = true;
        else
            button1.Enabled = false;
    }

    Saludos,


    Miguel Torres




    lunes, 29 de agosto de 2016 18:23
  • hola

    para eso usas el evento Validating no el keypress

    public void TextBox1_Validating(...){
    
       if(TextBox1.Text == ""){
               e.Cancel = true;      
               errorProvider1.SetError(textBox1, "El campo es obligatorio");
       }
    
    }

    define un control ErrorProvider en el form ya que no puede usar el MessageBox.Show()

    al cancelar el evento no se podra quitar el foco del textbox

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 29 de agosto de 2016 18:24
  • Ricardo de Jesus Castro

    En relación a la función encuentraprecio(), ¿esta requiere el valor del textBox?. Pregunto porque no se observa que tome ese valor como argumento.

    Saludos, 


    Miguel Torres



    lunes, 29 de agosto de 2016 18:32
  • si Miguel esa función es para buscar en una tabla de sql, lo que quiero es que no avance hasta que tenga la longitud correcta o hasta que no encuentre en la tabla.

    no se si me explique bien

    lunes, 29 de agosto de 2016 19:06
  • Hola Ricardo de Jesus Castro

    Puede usar el evento Validating. Note que debe agregar un control ErrorProvider al formulario.

            private void textBox1_Validating(object sender, System.ComponentModel.CancelEventArgs e)
            {
                // Esta parte especifica que la longitud no puede ser cero (0) 
                if (textBox1.Text.Trim().Length == 0)
                {
                    e.Cancel = true;
                    errorProvider1.SetError(textBox1, "Se requiere un valor");
                }
    
                // En esta parte puede verificar el valor en la base de datos.
                bool Encontrado = false;
                // Si el valor es encontrado, establezca: Encontrado = true;
    
                if (Encontrado == true)
                    e.Cancel = false;
                else
                    e.Cancel = true;
    
            }


    Luego en el evento Validate agrega la funcion:

    private void textBox1_Validated(object sender, EventArgs e)
    {
         encuentraprecio();   
    }

    Si le ha servido no olvide votar y establecer como respuestas.

    Saludos,


    Miguel Torres



    lunes, 29 de agosto de 2016 19:29
  • donde o como agrego el control ErrorProvider?
    lunes, 29 de agosto de 2016 19:33
  • Ricardo de Jesus Castro

    En el Cuadro de Herramientas (ToolBox), bien sea en la Pestaña Componentes (Components) o en la pestaña Todos los Formularios de Windows (All Windows Forms, en la misma lista de controles donde está TextBox, ComboBox, etc).

    Lo agrega al formulario como cualquier otro control y lo utiliza como se muestra en el código de ejemplo.

    Saludos, 


    Miguel Torres




    lunes, 29 de agosto de 2016 19:38
  • gracias,

    Pero no funciono, me sigue pasando debo de encontrar otra forma

    lunes, 29 de agosto de 2016 19:57
  • Ricardo de Jesus Castro

    ¿Puede usted mostrar el código de cómo lo está haciendo?

    Saludos,


    Miguel Torres


    lunes, 29 de agosto de 2016 20:20
  • Hola Ricardo de Jesus Castro,

    [-] ... esa función es para buscar en una tabla de sql, lo que quiero es que no avance hasta que tenga la longitud correcta o hasta que no encuentre en la tabla.

    La longitud que se debe a ingresar en el TextBox es fija ? Es decir (un ejemplo el dni es longitud 8 en mi país) siempre debe tener esa longitud o puede variar según el caso.

    Hasta que no encuentre en la BD : Si el valor que deseas ingresar NO EXISTE en la BD si puedes seguir, es así ?

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    lunes, 29 de agosto de 2016 20:23
  • private void txtcodigo_KeyPress(object sender, KeyPressEventArgs e)
    {
    TextBox txtcodigo = (TextBox)sender;
    if ((int)e.KeyChar == (int)Keys.Enter)
    {
    if (txtcodigo.Text.Length == 0) { MessageBox.Show("Necesario Especificar un Codigo", "Error de Captura de Codigo"); txtcodigo.Focus(); Application.Restart(); }
    else
    {
    try
    {
    encuentraprecio(); <------Aqui busca en la base de datos
    lblarticulo.Text = "Articulo: " + dataGridView1.Rows[0].Cells[1].Value.ToString(); <----Con esto se trae el resultado de la busqueda de encuentraprecio para agregarse a otra gridview
    y es alli donde marca el error cuando no cuentra nada
    lblarticulo.Visible = true;
    }
    finally { }
    }
    }
    }
    lunes, 29 de agosto de 2016 20:41
  • asi lo estoy haciendo:

    private void txtcodigo_KeyPress(object sender, KeyPressEventArgs e)
    {
    TextBox txtcodigo = (TextBox)sender;
    if ((int)e.KeyChar == (int)Keys.Enter)
    {
    if (txtcodigo.Text.Length == 0) { MessageBox.Show("Necesario Especificar un Codigo", "Error de Captura de Codigo"); txtcodigo.Focus();}
    else
    {
    try
    {
    encuentraprecio(); <------Aqui busca en la base de datos
    lblarticulo.Text = "Articulo: " + dataGridView1.Rows[0].Cells[1].Value.ToString(); <----Con esto se trae el resultado de la busqueda de encuentraprecio para agregarse a otra gridview
    y es alli donde marca el error cuando no cuentra nada
    lblarticulo.Visible = true;
    }
    finally { }
    }
    }
    }

    lunes, 29 de agosto de 2016 20:42
  • si es asi como dices Joel
    lunes, 29 de agosto de 2016 20:56
  • Hola Ricardo de Jesus Castro

    Pero no le ha hecho ninguna variación al código. No ha implementado ninguna de las recomendaciones.

    Hay un evento para forzar que un textBox mantenga el enfoque si no se han cumplido algunas condiciones de validación: Validating.  Y  Validated lo puede utilizar para las acciones posteriores (cuando el textBox pierde el foco habiendo cumplido las condiciones).

    Tampoco se observa código para el control ErrorProvider.

    Debería usted intentar avanzar en las propuestas.

    Saludos,


    Miguel Torres


    lunes, 29 de agosto de 2016 21:38
  • si es asi como dices Joel

    Hola Ricardo de Jesus Castro,

    En tu código que muestras validas en el KeyPress si el usuario presionó ENTER.  Entonces basándose en ese modo si el usuario escribe su código y presiona enter es porque ya está listo para verificar, ahí es donde debes de iniciar el proceso de validación.

    Además, deberías agregar un valor de retorno a tu método encuentraPrecio() a un tipo bool, si encuentra true, sino false, así sabes si la búsqueda produjo resultados o no.

    Dónde la lógica sería la siguiente.

         private void txtcodigo_KeyPress(object sender, KeyPressEventArgs e)
            {
                TextBox txt = (TextBox)sender;
    
                if(e.KeyChar == (char)Keys.Enter)
                {
                    if(txt.Text.Trim() == string.Empty)
                    {
                        MessageBox.Show("Debe ingresar un código.");
                        txt.Focus();
                        return;  //Salimos
                    }
    
                    if (encuentraPrecio() == false)
                    {
                        MessageBox.Show("No se encontró el precio.");
                        return;  //Salimos
                    }
    
                    //Precio encontrado seguimos
                    ...
                }
            }

    Si una validación no cumple, mediante el uso del return salgo del evento para no ejecutar lo siguiente.

    El método :

            private bool encuentraPrecio()
            {
                //Si encuentra precio es True
                //Aquí tu código...
            }

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    lunes, 29 de agosto de 2016 22:15
  • Gracias Joel

    El código quedo de la siguiente forma

     private void encuentraprecio()
            {
              
                    dataGridView1.DataSource = busca1();
       
             }
            System.Data.DataTable busca1()
            {
                string sql = "select precio, articulo from productos_venta where codigo='" + txtcodigo.Text + "'";
                SqlDataAdapter da = new SqlDataAdapter(sql, ConectionBDD());
                DataTable dt = new DataTable();
                da.Fill(dt);
                return dt;
            }
            //Funcion del boton Enter codigo
            private void txtcodigo_KeyPress(object sender, KeyPressEventArgs e)
            {
               TextBox txt = (TextBox)sender;
                if(e.KeyChar == (char)Keys.Enter)
                {
                    if(txt.Text.Trim() == string.Empty)
                    {
                        MessageBox.Show("Debe ingresar un código.");
                        txt.Focus();
                        return;  //Salimos
                    }
                    if (encuentraprecio()==false) <--------aquí me marca "el operador == no se puede aplicar
                    {
                        MessageBox.Show("No se encontró el precio.");
                        return;  //Salimos
                    }
                    MessageBox.Show("Precio Encontrado!");
                   
                }
            }

    me aparece el detalle que te pongo en el código, sobre el operador == nose puede aplicar en tipo void y bool

    a que se puede deber?

    martes, 30 de agosto de 2016 15:04
  • Hola Ricardo de Jesus Castro

    --me aparece el detalle que te pongo en el código, sobre el operador == nose puede aplicar en tipo void y bool

    Buscar1, devuelve una DataTable y no un valor Boolean (True o False), por lo tanto no se puede utilizar de esa forma.

    Le recomiendo utilizar buscar1 el evento Validating de la siguiente forma: 

    private void textBox1_Validating(object sender, CancelEventArgs e)
    {
         // Esta parte especifica que la longitud no puede ser cero (0) 
          if (textBox1.Text.Trim().Length == 0)
           {
               e.Cancel = true;
               // Puede utilizar ErrorProvider 
           }
    
          // En esta parte puede verificar si la tabla tiene filas.
           if (busca1().Rows.Count != 0)
               e.Cancel = false;
           else
               e.Cancel = true;
    }

    Saludos,


    Miguel Torres


    martes, 30 de agosto de 2016 18:59
  • Hola Ricardo de Jesus Castro

    Puede también cargar los datos en el DataGridView en el mismo evento. Revise este código:

     private void textBox1_Validating_1(object sender, CancelEventArgs e)
            {
                // Esta parte especifica que la longitud no puede ser cero (0) 
                if (textBox1.Text.Trim().Length == 0)
                {
                    e.Cancel = true;
                    //errorProvider1.SetError(textBox1, "Se requiere un valor");
                }
    
                // En esta parte puede verificar si la tabla tiene filas.
                DataTable tabla = busca1();
    
                if (tabla.Rows.Count != 0)
                {
                    dataGridView1.DataSource = tabla;
                    e.Cancel = false;
                }
                else
                {
                    e.Cancel = true;
                }
            }

    Debe deshabilitar el método encuentraprecio.

    Saludos,


    Miguel Torres



    martes, 30 de agosto de 2016 19:10
  • si pero si lo uso de esta manera no me arrojara el resultado en el DataGridView y también se necesita para verificar el precio. saludos
    martes, 30 de agosto de 2016 19:19
  • Ricardo de Jesus Castro

    Revise la última respuesta, allí está incluido el código para mostrar la información en el dataGridView. Aquí se lo dejo. El código lo he probado y ha funcionado.

    private void textBox1_Validating_1(object sender, CancelEventArgs e)
            {
                // Esta parte especifica que la longitud no puede ser cero (0) 
                if (textBox1.Text.Trim().Length == 0)
                {
                    e.Cancel = true;
                    //errorProvider1.SetError(textBox1, "Se requiere un valor");
                }
    
                // En esta parte puede verificar si la tabla tiene filas.
                DataTable tabla = busca1();
    
                if (tabla.Rows.Count != 0)
                {
                    dataGridView1.DataSource = tabla;
                    e.Cancel = false;
                }
                else
                {
                    e.Cancel = true;
                }
            }
    Saludos,

    Saludos,


    ___________________ Miguel Torres

    martes, 30 de agosto de 2016 19:27
  • al momento de no encontrar nada en el text box no busca eso esta bien

    pero al momento de meter caracteres por ejemplo el "1"  el texto carga "\r\n1" y no encuentra nada en la busqueda 

    martes, 30 de agosto de 2016 20:14
  • bueno eso se soluciona con este replace

    txtcodigo.Text = txtcodigo.Text.Replace("\r\n", " ");

    pero la búsqueda no me la arroja en el gridview

    martes, 30 de agosto de 2016 20:17
  • ya quedo, tenia un espacio de mas

    txtcodigo.Text = txtcodigo.Text.Replace("\r\n", ""); <--- as es

    txtcodigo.Text = txtcodigo.Text.Replace("\r\n", " ");

    martes, 30 de agosto de 2016 20:21
  • asi fue como quedo funcionando al ultimo private void txtcodigo_KeyPress(object sender, KeyPressEventArgs e) { TextBox txt = (TextBox)sender; if (e.KeyChar == (char)Keys.Enter) { if (txt.Text.Trim() == string.Empty) { MessageBox.Show("Debe ingresar un código."); txt.Focus(); return; } else { encuentraprecio(); } } } System.Data.DataTable busca1() { txtcodigo.Text = txtcodigo.Text.Replace("\r\n", ""); string sql = "select precio, articulo from productos_venta where codigo='" + txtcodigo.Text + "'"; SqlDataAdapter da = new SqlDataAdapter(sql, ConectionBDD()); DataTable dt = new DataTable(); da.Fill(dt); return dt; } gracias Saludos
    martes, 30 de agosto de 2016 20:25