none
Usar dos TextBox para filtro en DataGridView RRS feed

  • Pregunta

  • hola espero me puedan ayudar tengo mi base de postgresql conectado a C# estoy intentanto hacer un filtro de una tabla mostrada en DataGridView para esto  utilizo el evenyo KeyUp en el TextBox, he logrado hacer el filtro pero solo con un textbox y al hacer una segunda condicion me filtra por el valor de el segundo texbox y me quita el primer filtro, lo que intento hacer es hacer el filtro segun los valores de mis TexBox como si fueran dos condiciones el codigo que estoy esando es  en C# y es el siguiente:

    using Npgsql;

    namespace prueba_conexionC
    {
        public partial class Form1 : Form
        {
           NpgsqlConnection con = new NpgsqlConnection ("Server=localhost;Port=5432;User Id=usuario1;Password=123456;Database=bdescuela;");


            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Load(object sender, EventArgs e)
            {

            }

            private void textBox1_KeyUp(object sender, KeyEventArgs e)
            {

                con.Open(); 
               NpgsqlCommand cmd = con.CreateCommand();
               cmd.CommandType = CommandType.Text;
               cmd.CommandText = "SELECT * FROM aforo where aforonum = ('" + textBox1.Text + "')";
               cmd.ExecuteNonQuery();

               DataTable dt = new DataTable();
               NpgsqlDataAdapter da = new NpgsqlDataAdapter(cmd);

               da.Fill(dt);
               dataGridView1.DataSource = dt;

               con.Close();
            }

            private void textBox2_KeyUp(object sender, KeyEventArgs e)
            {

               con.Open();

               NpgsqlCommand cmd = con.CreateCommand();
               cmd.CommandType = CommandType.Text;
               cmd.CommandText = "SELECT * FROM aforo where sentido = ('" + textBox2.Text + "')";
               cmd.ExecuteNonQuery();

               DataTable dt = new DataTable();
               NpgsqlDataAdapter da = new NpgsqlDataAdapter(cmd);

               da.Fill(dt);
               dataGridView1.DataSource = dt;

               con.Close();

            }
        }
    }

    viernes, 8 de mayo de 2015 19:48

Respuestas

  •  Que tal amigo puedes colocar en cada texbox que se dispare con el enter. De tal manera al presionar solo enter en ese campo se dispara.

     Podes de usar ilike porque Postgres es case sensitive

    Te recomiendo que utilices parametros

    Ejemplo:

       cmd.CommandText = "SELECT * FROM aforo where sentido ilike @sentido ";
              cmd.Parameters.AddWithValue("@sentido ", textBox2.text);

    Ejemplo:

    private void textBox1_KeyUp(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { con.Open(); NpgsqlCommand cmd = con.CreateCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT * FROM aforo where aforonum ilike @aforonum";

    cmd.Parameters.AddWithValue("@aforonum", textBox1.text); cmd.ExecuteNonQuery(); DataTable dt = new DataTable(); NpgsqlDataAdapter da = new NpgsqlDataAdapter(cmd); da.Fill(dt); dataGridView1.DataSource = dt; con.Close(); } }


    private void textBox2_KeyUp(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { con.Open(); NpgsqlCommand cmd = con.CreateCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT * FROM aforo where sentido ilike @sentido ";

       cmd.Parameters.AddWithValue("@sentido ", textBox2.text); cmd.ExecuteNonQuery(); DataTable dt = new DataTable(); NpgsqlDataAdapter da = new NpgsqlDataAdapter(cmd); da.Fill(dt); dataGridView1.DataSource = dt; con.Close(); } }

    -----------------------------------------------------------------------------------------

    OBS: Favor vota si te es útil la información.
    Saludos
    Bader Molinas - Paraguay
    https://deveintel.wordpress.com/




    • Editado Bader Molinas viernes, 8 de mayo de 2015 20:10
    • Marcado como respuesta Vilag viernes, 8 de mayo de 2015 21:00
    viernes, 8 de mayo de 2015 20:05

Todas las respuestas

  • No conosco del todo la bd de postgresql , pero con sql lo hacia de esta manera.

    NpgsqlCommand cmd = con.CreateCommand();
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = "SELECT * FROM aforo where aforonum = ('" + textBox1.Text + "')";

    -- en esta parte hacia lo siguientecmd.CommandText = "SELECT * FROM aforo where aforonum like ('" + textBox1.Text + "')  and   aforonum like ('" + textBox2.Text + "')  ";

    -- es decir pon las dos cajas de textos en un like y en la misma consulta asi de va a filtrar cambies uno o el otro y ninguno de los dos filtros se perdera, espero que te sirve y espero que haya sido entendiblie, saludos
    cmd.ExecuteNonQuery();

    viernes, 8 de mayo de 2015 19:59
  •  Que tal amigo puedes colocar en cada texbox que se dispare con el enter. De tal manera al presionar solo enter en ese campo se dispara.

     Podes de usar ilike porque Postgres es case sensitive

    Te recomiendo que utilices parametros

    Ejemplo:

       cmd.CommandText = "SELECT * FROM aforo where sentido ilike @sentido ";
              cmd.Parameters.AddWithValue("@sentido ", textBox2.text);

    Ejemplo:

    private void textBox1_KeyUp(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { con.Open(); NpgsqlCommand cmd = con.CreateCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT * FROM aforo where aforonum ilike @aforonum";

    cmd.Parameters.AddWithValue("@aforonum", textBox1.text); cmd.ExecuteNonQuery(); DataTable dt = new DataTable(); NpgsqlDataAdapter da = new NpgsqlDataAdapter(cmd); da.Fill(dt); dataGridView1.DataSource = dt; con.Close(); } }


    private void textBox2_KeyUp(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { con.Open(); NpgsqlCommand cmd = con.CreateCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = "SELECT * FROM aforo where sentido ilike @sentido ";

       cmd.Parameters.AddWithValue("@sentido ", textBox2.text); cmd.ExecuteNonQuery(); DataTable dt = new DataTable(); NpgsqlDataAdapter da = new NpgsqlDataAdapter(cmd); da.Fill(dt); dataGridView1.DataSource = dt; con.Close(); } }

    -----------------------------------------------------------------------------------------

    OBS: Favor vota si te es útil la información.
    Saludos
    Bader Molinas - Paraguay
    https://deveintel.wordpress.com/




    • Editado Bader Molinas viernes, 8 de mayo de 2015 20:10
    • Marcado como respuesta Vilag viernes, 8 de mayo de 2015 21:00
    viernes, 8 de mayo de 2015 20:05
  • Hola Vilag nuevamente, te mencione lo que podrías hacer es agregar un control checkbox y a partir de ellos deberías evaluar si es esta seleccionado (Filtrara por los dos textbox caso contrario solo por el primero):

          private void textBox1_KeyUp(object sender, KeyEventArgs e)
            {
    	   //Si el checbox esta activado filtrara por ambos textbox
    	   if(CheckBox01.Checked == true)
    	   {
                con.Open();  
               NpgsqlCommand cmd = con.CreateCommand();
               cmd.CommandType = CommandType.Text;
               cmd.CommandText = "SELECT * FROM aforo where aforonum = ('" + textBox1.Text + "') and sentido = ('" + textBox2.Text + "')";
               cmd.ExecuteNonQuery();
    
               DataTable dt = new DataTable();
               NpgsqlDataAdapter da = new NpgsqlDataAdapter(cmd);
    
               da.Fill(dt);
               dataGridView1.DataSource = dt;
    
               con.Close();
    
    	   }
    
    	   //Si el checkBox esta desactivo solo filtra por el primer textbox
    	   else if(CheckBox01.Checked == false)
    	   {
               con.Open();  
               NpgsqlCommand cmd = con.CreateCommand();
               cmd.CommandType = CommandType.Text;
               cmd.CommandText = "SELECT * FROM aforo where aforonum = ('" + textBox1.Text + "')";
               cmd.ExecuteNonQuery();
    
               DataTable dt = new DataTable();
               NpgsqlDataAdapter da = new NpgsqlDataAdapter(cmd);
    
               da.Fill(dt);
               dataGridView1.DataSource = dt;
    
               con.Close();
    	   }
            }
    Espero haberte ayudado.

    viernes, 8 de mayo de 2015 20:06
  • Hola nuvamente Aldair he hecho lo que me recomendaste y no he podido hacer que funcione para ambos campos, cuando ingreso los datos en el primer TextBox si realiza el filtro entonces activo la casilla para el segundo text y no hace el filtro se queda en el primero, intente activando la casilla antes de comenzar a introducir datos en ambos campos  pero en este caso no funciona ninguno. Ay alguna otra alternativa? quiza usar un AND en SQL, bueno son ideas que tengo pero tu eres quien tiene la experiencia espero me sigas ayudando muchas gracias.

    Saludos

    viernes, 8 de mayo de 2015 20:43
  • Perdona Vilag es que lo que te pase no esta del todo bien deberias colocar esta parte en el evento Keyup del segundo textbox :

      if(CheckBox01.Checked == true)
    	   {
                con.Open();  
               NpgsqlCommand cmd = con.CreateCommand();
               cmd.CommandType = CommandType.Text;
               cmd.CommandText = "SELECT * FROM aforo where aforonum = ('" + textBox1.Text + "') and sentido = ('" + textBox2.Text + "')";
               cmd.ExecuteNonQuery();
    
               DataTable dt = new DataTable();
               NpgsqlDataAdapter da = new NpgsqlDataAdapter(cmd);
    
               da.Fill(dt);
               dataGridView1.DataSource = dt;
    
               con.Close();
    
    	   }

    Saludos.

    viernes, 8 de mayo de 2015 20:49
  • No conosco del todo la bd de postgresql , pero con sql lo hacia de esta manera.

    NpgsqlCommand cmd = con.CreateCommand();
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = "SELECT * FROM aforo where aforonum = ('" + textBox1.Text + "')";

    -- en esta parte hacia lo siguientecmd.CommandText = "SELECT * FROM aforo where aforonum like ('" + textBox1.Text + "')  and   aforonum like ('" + textBox2.Text + "')  ";

    -- es decir pon las dos cajas de textos en un like y en la misma consulta asi de va a filtrar cambies uno o el otro y ninguno de los dos filtros se perdera, espero que te sirve y espero que haya sido entendiblie, saludos
    cmd.ExecuteNonQuery();


    Hola Javb gracias por tu respuesta lo que me recomiendas ya lo habia intentado y no me funciono ya que esta parte del codigo esta en un evento del textbox1 y por lo tanto hasta que agrege el evento del segundo textbox podre hacer que funcione lo que quiero es que  vaya filtrando conforme se capturan los tados por eso quiza no me funciona en que ponga los dos campos en una misma sentencia a menos que escriba la sentencia fuera de los eventos del campo pero aun no se como hacerlo, entiendo que no tienes mucha experiencia con postgresql yo estoy igual pero valoro mucho tu respuesta. Muchas gracias Saludos
    viernes, 8 de mayo de 2015 20:59
  • Que tal Bader te agradezco mucho tu respuesta usando tus recomendaciones logre hacer lo que queria, solo si me permites me gustaria hacerte dos preguntas, estoy aprendiendo y solo es para aclarar mis dudas.

    1. Que diferencia hay entre usar parametros y no usar?

    2. es posible que en vez de dar enter en cada campo se vayan filtrando conforme se van escribiendo los datos?

    Espero tu respuesta.

    Saludos

    viernes, 8 de mayo de 2015 21:03