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
Procedimiento
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
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
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
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
No hay comentarios. :
Publicar un comentario