none
Como Hacer un filtro en C# Usando un tabla de Sql 2008 RRS feed

  • Pregunta

  • Hola amigos tengo un problema, necesito hacer un tipo de filtro a una tabla en una base de datos de sql server 2008 y necesito que esta informacion se muestre en un datagridview, por decir algo que tenga un textbox y que yo al ir introduciendo palabras en ese textbox me muestre los posibles nombres relacionados con la busqueda.

    en un blog encontre que lo puedo hacer inicializando la coneccion a la base de datos desde el load del form y que luego por el evento keypress me haga el filtrado, pero eso estaba en VB y yo no le entendi muy bien asi que me gustaria saber si me pueden dar una guia de como hacerlo o por cual otro metodo lo podria hacer, de antemano agradesco la ayuda que me puedan brindar saludos.

    jueves, 18 de noviembre de 2010 9:54

Respuestas

  • hola

    en realidad usar el evento keypress un lanzar una consulta a una db por cada tecla presionada puede ser costoso en temas de performance ya que en cada tecla estaria ejecutando y trayendo todos los datos

    por ahi podrias traer la info completa en un datatable y luego diltrar en memoria con cada tecla pulsada, este tecncia si bien consume ams memoria, y puede que si la cantidad de registros es muy grande no sea conveniente, pero si garantiza una respuesta rapidisima

    con este codigo te traes toda la info y la cargas en el datagridiview

    DataTable dt = new DataTable();

    using (SqlConnection conn = new SqlConnection("<cadena conexion>")) {
        conn.Open();

        string query = "SELECT campo1, campo2 FROM NombreTable";

        SqlCommand cmd = new SqlCommand(query, conn);

        SqlDataAdapter da = new SqlDataAdapter(cmd);
        da.Fill(dt);

    }

    DataGridView1.DataSource = dt;

    ojo puede que no necesites cargarla de entrada sino cuando se presiona una tecla

     

    despues puedes usar el evento KeyUp, el cual es mejor que el keypress asi aseguras que el nuevo caracter esta en el textbox cuando lo uses en el filtro

    podrias aplciar algo como esto

    private void TextBox1_KeyUp(System.Object sender, System.Windows.Forms.KeyEventArgs e)
    {
        DataView dataView = dt.DefaultView;

        dataView.RowFilter = string.Format("campo LIKE '%{0}'", TextBox1.Text);

        DataGridView1.DataSource = dataView;

    }

    como veras se usar el datatabla anteriormente cargado para confeccionar el filtro

    el codigo completo podria ser

     

       public partial class Form1 : Form
        {
            DataTable dt = null;

            private void Form1_Load(object sender, EventArgs e)
            {

                using (SqlConnection conn = new SqlConnection("<cadena conexion>"))
                {
                    conn.Open();

                    string query = "SELECT campo1, campo2 FROM NombreTable";

                    SqlCommand cmd = new SqlCommand(query, conn);

                    SqlDataAdapter da = new SqlDataAdapter(cmd);
                    da.Fill(dt);

                }
               
            }

            private void TextBox1_KeyUp(System.Object sender, System.Windows.Forms.KeyEventArgs e)
            {
                DataView dataView = dt.DefaultView;

                dataView.RowFilter = string.Format("campo LIKE '%{0}'", TextBox1.Text);

                DataGridView1.DataSource = dataView;

            }

        }

     

    veras que el DataTable se declara de forma global para poder ser accedido desde ambos eventos

    bueno espero sea de utilidad lo comentado

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta Yeiris jueves, 18 de noviembre de 2010 18:26
    jueves, 18 de noviembre de 2010 12:12

Todas las respuestas

  • hola

    en realidad usar el evento keypress un lanzar una consulta a una db por cada tecla presionada puede ser costoso en temas de performance ya que en cada tecla estaria ejecutando y trayendo todos los datos

    por ahi podrias traer la info completa en un datatable y luego diltrar en memoria con cada tecla pulsada, este tecncia si bien consume ams memoria, y puede que si la cantidad de registros es muy grande no sea conveniente, pero si garantiza una respuesta rapidisima

    con este codigo te traes toda la info y la cargas en el datagridiview

    DataTable dt = new DataTable();

    using (SqlConnection conn = new SqlConnection("<cadena conexion>")) {
        conn.Open();

        string query = "SELECT campo1, campo2 FROM NombreTable";

        SqlCommand cmd = new SqlCommand(query, conn);

        SqlDataAdapter da = new SqlDataAdapter(cmd);
        da.Fill(dt);

    }

    DataGridView1.DataSource = dt;

    ojo puede que no necesites cargarla de entrada sino cuando se presiona una tecla

     

    despues puedes usar el evento KeyUp, el cual es mejor que el keypress asi aseguras que el nuevo caracter esta en el textbox cuando lo uses en el filtro

    podrias aplciar algo como esto

    private void TextBox1_KeyUp(System.Object sender, System.Windows.Forms.KeyEventArgs e)
    {
        DataView dataView = dt.DefaultView;

        dataView.RowFilter = string.Format("campo LIKE '%{0}'", TextBox1.Text);

        DataGridView1.DataSource = dataView;

    }

    como veras se usar el datatabla anteriormente cargado para confeccionar el filtro

    el codigo completo podria ser

     

       public partial class Form1 : Form
        {
            DataTable dt = null;

            private void Form1_Load(object sender, EventArgs e)
            {

                using (SqlConnection conn = new SqlConnection("<cadena conexion>"))
                {
                    conn.Open();

                    string query = "SELECT campo1, campo2 FROM NombreTable";

                    SqlCommand cmd = new SqlCommand(query, conn);

                    SqlDataAdapter da = new SqlDataAdapter(cmd);
                    da.Fill(dt);

                }
               
            }

            private void TextBox1_KeyUp(System.Object sender, System.Windows.Forms.KeyEventArgs e)
            {
                DataView dataView = dt.DefaultView;

                dataView.RowFilter = string.Format("campo LIKE '%{0}'", TextBox1.Text);

                DataGridView1.DataSource = dataView;

            }

        }

     

    veras que el DataTable se declara de forma global para poder ser accedido desde ambos eventos

    bueno espero sea de utilidad lo comentado

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta Yeiris jueves, 18 de noviembre de 2010 18:26
    jueves, 18 de noviembre de 2010 12:12
  • Creo que lo que necesitás es un autocomplete.  Si estás usando WinForms acá tenés algunos:
     
    Si usás ASP.NET acá tenés uno:
     
    Saludos.
     

    Para el correcto funcionamiento y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido útil por favor Vótala.

    Gustavo A. Cantero
    Scientia® Soluciones Informáticas
    MCP - MCSD - MCTS - MCPD
    http://www.scientia.com.ar
    http://www.programandoamedianoche.com
    http://www.gustavo-cantero.com.ar
    http://twitter.com/ScientiaIT
    http://facebook.com/ScientiaIT
    jueves, 18 de noviembre de 2010 15:37
  • Muchas gracias Voy a probar sus sugerencias cualquier cosa ahi les digo como me fue, y gracias por su ayuda
    jueves, 18 de noviembre de 2010 17:04
  • Muchas Gracias Amigos por su Ayuda ya lo logre hacer usando el evento KeyUp como me dijo Leandro muchas gracias por su ayuda son los mejores
    jueves, 18 de noviembre de 2010 18:24