[C# - Linq] Buscar en Datagridview y ordenar resultados con LINQ utilizando lista generica

Introducción

En este articulo les voy a mostrar como buscar en una datagridview y ordenar los resultados con LINQ. Utilizaremos para buscar la extensión Contains y para ordenar los resultados en forma ascendente o descendente con orderby.

Interfaz Gráfica

La interfaz gráfica es la siguiente:



Procedimiento

Vamos a utilizar la base de datos AdventureWorks2012, en caso de no tener dicha base de datos, podes ver este link  para descargarla e instalarla.

Luego de tener nuestra base de datos preparada, vamos a utilizar la tabla Person.Person y de dicha tabla vamos a usar las columnas BusinessEntityID, FirstName, MiddleName y LastName.

Luego de crear nuestro proyecto, agregamos una clase llamada personEn que va a contener las propiedades que van a corresponder a cada columna

    class personEn
    {
        public int codEn { get; set; }
        public string firstName { get; set; }
        public string middleName { get; set; }
        public string lastName { get; set; }
    }

En el evento load del formulario vamos a cargar nuestro datagridview

        private void BuscarOrdenarFrm_Load(object sender, EventArgs e)
        {
            itemsCMB.SelectedIndex = 0;
            dataDG.DataSource = getPersons();

            dataDG.Columns[0].Width = 120;
            dataDG.Columns[1].Width = 120;
            dataDG.Columns[2].Width = 120;
            dataDG.Columns[3].Width = 120;
        }

        private List<personEn> getPersons()
        {
            using (SqlConnection cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["CNNBD"].ToString()))
            {
                cnn.Open();

                string query = "SELECT BusinessEntityID,FirstName, " +
                                    "MiddleName,LastName FROM Person.Person";
                SqlCommand cmd = new SqlCommand(query, cnn);
                SqlDataReader reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    personEn person = new personEn();
                    person.codEn = reader.GetInt32(0);
                    person.firstName = reader[1].ToString();
                    person.middleName = reader[2].ToString();
                    person.lastName = reader[3].ToString();

                    personList.Add(person);
                }
            }

            return personList;
        }

En el sqlconnection utilizo la clase ConfigurationManager para obtener la cadena de conexión a nuestra base de datos.

Buscar

Para buscar una entidad vamos a utilizar la extensión Contains de linq que devuelve resultados si la propiedad por la cual buscamos contiene uno o mas caracteres por las cuales buscamos.

Por ejemplo: Buscamos por la propiedad firstName y estamos buscando el nombre: Kim. Con la extensión Contains no es necesario escribir el nombre completo sino que basta con una letra ya sea la "k" la "i" o la "m". Es recomendable escribir la palabra completa ya que así nos va a devolver menos resultados porque la extensión Contains busca un caracter que le especifiquemos en una cadena de texto.

        private void searchBtn_Click(object sender, EventArgs e)
        {
            var q = (dynamic)null;

            switch (itemsCMB.SelectedItem.ToString())
            {
                case "firstName":
                    q = (from item in personList
                         where item.firstName.Contains(buscarTxt.Text.ToString())
                         select item).ToList<personEn>();
                    break;
                case "middleName":
                    q = (from item in personList
                         where item.middleName.Contains(buscarTxt.Text.ToString())
                         select item).ToList<personEn>();
                    break;
                case "lastName":
                    q = (from item in personList
                         where item.lastName.Contains(buscarTxt.Text.ToString())
                         select item).ToList<personEn>();
                    break;
            }

            dataDG.DataSource = q;
        }

En este caso estamos buscando dependiendo el valor seleccionado en nuestro combobox y a partir de ese valor filtramos a través del where por la propiedad correspondiente al valor seleccionado. El resultado se lo asignamos al datasource del datagridview.

 Ordenar

Para ordenar lo vamos hacer de dos formas distintas. La primera forma es que vamos a ordenar la lista completa de forma ascendente y descendente, esto quiere decir que vamos a ordenar la lista como viene de nuestra base de datos, no los resultados de una búsqueda.

La segunda forma es que vamos a ordenar los resultados de una búsqueda o solamente los valores que haya en nuestro datagridview.

Para la primera forma (ascendente):

        private void orderBtn_Click(object sender, EventArgs e)
        {
            var q = (from item in personList
                     orderby item.codEn ascending
                     select item).ToList<personEn>();

            dataDG.DataSource = q;
        }

Utilizamos el orderby de linq y especificamos que propiedad queremos ordenar, en este caso el codigo de cada entidad, y la forma que va a ser ascendente (ascending)

Primera forma (descendente):

        private void orderDesBtn_Click(object sender, EventArgs e)
        {
            var q = (from item in personList
                     orderby item.codEn descending
                     select item).ToList<personEn>();

            dataDG.DataSource = q;
        }

Se hace exactamente de la misma manera, pero cambiamos ascending por descending

Para la segunda forma:

        private void orderDgBtn_Click(object sender, EventArgs e)
        {
            List<personEn> newList = new List<personEn>();

            foreach (DataGridViewRow dr in dataDG.Rows)
            {
                personEn person = new personEn();
                person.codEn = Convert.ToInt32(dr.Cells[0].Value);
                person.firstName = dr.Cells[1].Value.ToString();
                person.middleName = dr.Cells[2].Value.ToString();
                person.lastName = dr.Cells[3].Value.ToString();

                newList.Add(person);
            }

            var q = (from item in newList
                     orderby item.codEn ascending
                     select item).ToList<personEn>();

            dataDG.DataSource = q;
        }

Declaramos una nueva lista y recorremos nuestro datagridview actual con sus valores y se los asignamos al objeto person el cual lo agregamos a nuestra nueva lista.

Luego queda hacer lo mismo que anteriormente pero esta vez recorremos la nueva lista.

 Conclusiones

Como verán se aplican estos filtros sobre la lista declarada a nivel clase al abrirse nuestro formulario por lo cual en caso de que se hayan insertado datos en la base de datos, estos no estaran actualizados. Para eso hemos creado un nuevo botón que actualice la lista

        private void reloadBtn_Click(object sender, EventArgs e)
        {
            personList.Clear();
            personList = getPersons();
            dataDG.DataSource = personList;
        }

Fin


El ejemplo esta sin la base de datos. VER: Link

Código Fuente

Dropbox  

Descargar

[C# - Linq] Buscar en Datagridview y ordenar resultados con LINQ utilizando lista generica

Introducción

En este articulo les voy a mostrar como buscar en una datagridview y ordenar los resultados con LINQ. Utilizaremos para buscar la extensión Contains y para ordenar los resultados en forma ascendente o descendente con orderby.

Interfaz Gráfica

La interfaz gráfica es la siguiente:



Procedimiento

Vamos a utilizar la base de datos AdventureWorks2012, en caso de no tener dicha base de datos, podes ver este link  para descargarla e instalarla.

Luego de tener nuestra base de datos preparada, vamos a utilizar la tabla Person.Person y de dicha tabla vamos a usar las columnas BusinessEntityID, FirstName, MiddleName y LastName.

Luego de crear nuestro proyecto, agregamos una clase llamada personEn que va a contener las propiedades que van a corresponder a cada columna

    class personEn
    {
        public int codEn { get; set; }
        public string firstName { get; set; }
        public string middleName { get; set; }
        public string lastName { get; set; }
    }

En el evento load del formulario vamos a cargar nuestro datagridview

        private void BuscarOrdenarFrm_Load(object sender, EventArgs e)
        {
            itemsCMB.SelectedIndex = 0;
            dataDG.DataSource = getPersons();

            dataDG.Columns[0].Width = 120;
            dataDG.Columns[1].Width = 120;
            dataDG.Columns[2].Width = 120;
            dataDG.Columns[3].Width = 120;
        }

        private List<personEn> getPersons()
        {
            using (SqlConnection cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["CNNBD"].ToString()))
            {
                cnn.Open();

                string query = "SELECT BusinessEntityID,FirstName, " +
                                    "MiddleName,LastName FROM Person.Person";
                SqlCommand cmd = new SqlCommand(query, cnn);
                SqlDataReader reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    personEn person = new personEn();
                    person.codEn = reader.GetInt32(0);
                    person.firstName = reader[1].ToString();
                    person.middleName = reader[2].ToString();
                    person.lastName = reader[3].ToString();

                    personList.Add(person);
                }
            }

            return personList;
        }

En el sqlconnection utilizo la clase ConfigurationManager para obtener la cadena de conexión a nuestra base de datos.

Buscar

Para buscar una entidad vamos a utilizar la extensión Contains de linq que devuelve resultados si la propiedad por la cual buscamos contiene uno o mas caracteres por las cuales buscamos.

Por ejemplo: Buscamos por la propiedad firstName y estamos buscando el nombre: Kim. Con la extensión Contains no es necesario escribir el nombre completo sino que basta con una letra ya sea la "k" la "i" o la "m". Es recomendable escribir la palabra completa ya que así nos va a devolver menos resultados porque la extensión Contains busca un caracter que le especifiquemos en una cadena de texto.

        private void searchBtn_Click(object sender, EventArgs e)
        {
            var q = (dynamic)null;

            switch (itemsCMB.SelectedItem.ToString())
            {
                case "firstName":
                    q = (from item in personList
                         where item.firstName.Contains(buscarTxt.Text.ToString())
                         select item).ToList<personEn>();
                    break;
                case "middleName":
                    q = (from item in personList
                         where item.middleName.Contains(buscarTxt.Text.ToString())
                         select item).ToList<personEn>();
                    break;
                case "lastName":
                    q = (from item in personList
                         where item.lastName.Contains(buscarTxt.Text.ToString())
                         select item).ToList<personEn>();
                    break;
            }

            dataDG.DataSource = q;
        }

En este caso estamos buscando dependiendo el valor seleccionado en nuestro combobox y a partir de ese valor filtramos a través del where por la propiedad correspondiente al valor seleccionado. El resultado se lo asignamos al datasource del datagridview.

 Ordenar

Para ordenar lo vamos hacer de dos formas distintas. La primera forma es que vamos a ordenar la lista completa de forma ascendente y descendente, esto quiere decir que vamos a ordenar la lista como viene de nuestra base de datos, no los resultados de una búsqueda.

La segunda forma es que vamos a ordenar los resultados de una búsqueda o solamente los valores que haya en nuestro datagridview.

Para la primera forma (ascendente):

        private void orderBtn_Click(object sender, EventArgs e)
        {
            var q = (from item in personList
                     orderby item.codEn ascending
                     select item).ToList<personEn>();

            dataDG.DataSource = q;
        }

Utilizamos el orderby de linq y especificamos que propiedad queremos ordenar, en este caso el codigo de cada entidad, y la forma que va a ser ascendente (ascending)

Primera forma (descendente):

        private void orderDesBtn_Click(object sender, EventArgs e)
        {
            var q = (from item in personList
                     orderby item.codEn descending
                     select item).ToList<personEn>();

            dataDG.DataSource = q;
        }

Se hace exactamente de la misma manera, pero cambiamos ascending por descending

Para la segunda forma:

        private void orderDgBtn_Click(object sender, EventArgs e)
        {
            List<personEn> newList = new List<personEn>();

            foreach (DataGridViewRow dr in dataDG.Rows)
            {
                personEn person = new personEn();
                person.codEn = Convert.ToInt32(dr.Cells[0].Value);
                person.firstName = dr.Cells[1].Value.ToString();
                person.middleName = dr.Cells[2].Value.ToString();
                person.lastName = dr.Cells[3].Value.ToString();

                newList.Add(person);
            }

            var q = (from item in newList
                     orderby item.codEn ascending
                     select item).ToList<personEn>();

            dataDG.DataSource = q;
        }

Declaramos una nueva lista y recorremos nuestro datagridview actual con sus valores y se los asignamos al objeto person el cual lo agregamos a nuestra nueva lista.

Luego queda hacer lo mismo que anteriormente pero esta vez recorremos la nueva lista.

 Conclusiones

Como verán se aplican estos filtros sobre la lista declarada a nivel clase al abrirse nuestro formulario por lo cual en caso de que se hayan insertado datos en la base de datos, estos no estaran actualizados. Para eso hemos creado un nuevo botón que actualice la lista

        private void reloadBtn_Click(object sender, EventArgs e)
        {
            personList.Clear();
            personList = getPersons();
            dataDG.DataSource = personList;
        }

Fin


El ejemplo esta sin la base de datos. VER: Link

Código Fuente

Dropbox  

Descargar

[C# - Linq] Buscar en Datagridview y ordenar resultados con LINQ utilizando lista generica

Introducción

En este articulo les voy a mostrar como buscar en una datagridview y ordenar los resultados con LINQ. Utilizaremos para buscar la extensión Contains y para ordenar los resultados en forma ascendente o descendente con orderby.

Interfaz Gráfica

La interfaz gráfica es la siguiente:



Procedimiento

Vamos a utilizar la base de datos AdventureWorks2012, en caso de no tener dicha base de datos, podes ver este link  para descargarla e instalarla.

Luego de tener nuestra base de datos preparada, vamos a utilizar la tabla Person.Person y de dicha tabla vamos a usar las columnas BusinessEntityID, FirstName, MiddleName y LastName.

Luego de crear nuestro proyecto, agregamos una clase llamada personEn que va a contener las propiedades que van a corresponder a cada columna

    class personEn
    {
        public int codEn { get; set; }
        public string firstName { get; set; }
        public string middleName { get; set; }
        public string lastName { get; set; }
    }

En el evento load del formulario vamos a cargar nuestro datagridview

        private void BuscarOrdenarFrm_Load(object sender, EventArgs e)
        {
            itemsCMB.SelectedIndex = 0;
            dataDG.DataSource = getPersons();

            dataDG.Columns[0].Width = 120;
            dataDG.Columns[1].Width = 120;
            dataDG.Columns[2].Width = 120;
            dataDG.Columns[3].Width = 120;
        }

        private List<personEn> getPersons()
        {
            using (SqlConnection cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["CNNBD"].ToString()))
            {
                cnn.Open();

                string query = "SELECT BusinessEntityID,FirstName, " +
                                    "MiddleName,LastName FROM Person.Person";
                SqlCommand cmd = new SqlCommand(query, cnn);
                SqlDataReader reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    personEn person = new personEn();
                    person.codEn = reader.GetInt32(0);
                    person.firstName = reader[1].ToString();
                    person.middleName = reader[2].ToString();
                    person.lastName = reader[3].ToString();

                    personList.Add(person);
                }
            }

            return personList;
        }

En el sqlconnection utilizo la clase ConfigurationManager para obtener la cadena de conexión a nuestra base de datos.

Buscar

Para buscar una entidad vamos a utilizar la extensión Contains de linq que devuelve resultados si la propiedad por la cual buscamos contiene uno o mas caracteres por las cuales buscamos.

Por ejemplo: Buscamos por la propiedad firstName y estamos buscando el nombre: Kim. Con la extensión Contains no es necesario escribir el nombre completo sino que basta con una letra ya sea la "k" la "i" o la "m". Es recomendable escribir la palabra completa ya que así nos va a devolver menos resultados porque la extensión Contains busca un caracter que le especifiquemos en una cadena de texto.

        private void searchBtn_Click(object sender, EventArgs e)
        {
            var q = (dynamic)null;

            switch (itemsCMB.SelectedItem.ToString())
            {
                case "firstName":
                    q = (from item in personList
                         where item.firstName.Contains(buscarTxt.Text.ToString())
                         select item).ToList<personEn>();
                    break;
                case "middleName":
                    q = (from item in personList
                         where item.middleName.Contains(buscarTxt.Text.ToString())
                         select item).ToList<personEn>();
                    break;
                case "lastName":
                    q = (from item in personList
                         where item.lastName.Contains(buscarTxt.Text.ToString())
                         select item).ToList<personEn>();
                    break;
            }

            dataDG.DataSource = q;
        }

En este caso estamos buscando dependiendo el valor seleccionado en nuestro combobox y a partir de ese valor filtramos a través del where por la propiedad correspondiente al valor seleccionado. El resultado se lo asignamos al datasource del datagridview.

 Ordenar

Para ordenar lo vamos hacer de dos formas distintas. La primera forma es que vamos a ordenar la lista completa de forma ascendente y descendente, esto quiere decir que vamos a ordenar la lista como viene de nuestra base de datos, no los resultados de una búsqueda.

La segunda forma es que vamos a ordenar los resultados de una búsqueda o solamente los valores que haya en nuestro datagridview.

Para la primera forma (ascendente):

        private void orderBtn_Click(object sender, EventArgs e)
        {
            var q = (from item in personList
                     orderby item.codEn ascending
                     select item).ToList<personEn>();

            dataDG.DataSource = q;
        }

Utilizamos el orderby de linq y especificamos que propiedad queremos ordenar, en este caso el codigo de cada entidad, y la forma que va a ser ascendente (ascending)

Primera forma (descendente):

        private void orderDesBtn_Click(object sender, EventArgs e)
        {
            var q = (from item in personList
                     orderby item.codEn descending
                     select item).ToList<personEn>();

            dataDG.DataSource = q;
        }

Se hace exactamente de la misma manera, pero cambiamos ascending por descending

Para la segunda forma:

        private void orderDgBtn_Click(object sender, EventArgs e)
        {
            List<personEn> newList = new List<personEn>();

            foreach (DataGridViewRow dr in dataDG.Rows)
            {
                personEn person = new personEn();
                person.codEn = Convert.ToInt32(dr.Cells[0].Value);
                person.firstName = dr.Cells[1].Value.ToString();
                person.middleName = dr.Cells[2].Value.ToString();
                person.lastName = dr.Cells[3].Value.ToString();

                newList.Add(person);
            }

            var q = (from item in newList
                     orderby item.codEn ascending
                     select item).ToList<personEn>();

            dataDG.DataSource = q;
        }

Declaramos una nueva lista y recorremos nuestro datagridview actual con sus valores y se los asignamos al objeto person el cual lo agregamos a nuestra nueva lista.

Luego queda hacer lo mismo que anteriormente pero esta vez recorremos la nueva lista.

 Conclusiones

Como verán se aplican estos filtros sobre la lista declarada a nivel clase al abrirse nuestro formulario por lo cual en caso de que se hayan insertado datos en la base de datos, estos no estaran actualizados. Para eso hemos creado un nuevo botón que actualice la lista

        private void reloadBtn_Click(object sender, EventArgs e)
        {
            personList.Clear();
            personList = getPersons();
            dataDG.DataSource = personList;
        }

Fin


El ejemplo esta sin la base de datos. VER: Link

Código Fuente

Dropbox  

Descargar

No hay comentarios. :

Publicar un comentario