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