Lo primero es desearos un buen año 2011, a ver si nos da cosas mejoras que 2010!
Bueno esta entrada viene como consecuencia de repetidas preguntas acerca de una buscada de un valor en el control DataGridView.
Os voy a exponer en (VB mañana cuelgo el código en c#) dos formas de hacerlo: la forma tradicional, y a través de LINQ:
Forma Tradicional
- Function Buscar(ByVal TextoABuscar As String, ByVal Columna As String, ByRef grid As DataGridView) As Boolean
- Dim encontrado As Boolean = False
- If TextoABuscar = String.Empty Then Return False
- If grid.RowCount = 0 Then Return False
- grid.ClearSelection()
- If Columna = String.Empty Then
- For Each row As DataGridViewRow In grid.Rows
- For Each cell As DataGridViewCell In row.Cells
- If cell.Value.ToString() = TextoABuscar Then
- row.Selected = True
- Return True
- End If
- Next
- Next
- Else
- For Each row As DataGridViewRow In grid.Rows
- If row.IsNewRow Then Return False
- If row.Cells(Columna).Value.ToString() = TextoABuscar Then
- row.Selected = True
- Return True
- End If
- Next
- End If
- Return encontrado
- End Function
Forma LINQ:
Forma LINQ
- Function BuscarLINQ(ByVal TextoABuscar As String, ByVal Columna As String, ByRef grid As DataGridView) As Boolean
- Dim encontrado As Boolean = False
- If TextoABuscar = String.Empty Then Return False
- If grid.RowCount = 0 Then Return False
- grid.ClearSelection()
- If Columna = String.Empty Then
- Dim obj As IEnumerable(Of DataGridViewRow) = From row As DataGridViewRow In grid.Rows.Cast(Of DataGridViewRow)()
- From celda As DataGridViewCell In row.Cells
- Where celda.OwningRow.Equals(row) And celda.Value = TextoABuscar
- Select row
- If obj.Any() Then
- grid.Rows(obj.FirstOrDefault().Index).Selected = True
- End If
- Else
- Dim obj As IEnumerable(Of DataGridViewRow) = From row As DataGridViewRow In grid.Rows.Cast(Of DataGridViewRow)()
- Where row.Cells(Columna).Value = TextoABuscar
- Select row
- If obj.Any() Then
- grid.Rows(obj.FirstOrDefault().Index).Selected = True
- End If
- End If
- Return encontrado
- End Function
En C#:
Forma Normal
- bool Buscar(string TextoABuscar,string Columna, DataGridView grid)
- {
- bool encontrado=false;
- if (TextoABuscar==string.Empty) return false;
- if (grid.RowCount == 0 ) return false;
- grid.ClearSelection();
- if (Columna==string.Empty)
- {
- foreach (DataGridViewRow row in grid.Rows)
- {
- foreach (DataGridViewCell cell in row.Cells )
- if (cell.Value==TextoABuscar)
- {
- row.Selected = true;
- return true;
- }
- }
- }
- else
- {
- foreach (DataGridViewRow row in grid.Rows)
- {
- if (row.Cells[Columna].Value==TextoABuscar)
- {
- row.Selected = true;
- return true;
- }
- }
- }
- return encontrado;
- }
Forma LINQ
- bool BuscarLINQ(string TextoABuscar,string Columna, DataGridView grid)
- {
- bool encontrado=false;
- if (TextoABuscar==string.Empty) return false;
- if (grid.RowCount == 0 ) return false;
- grid.ClearSelection();
- if (Columna==string.Empty)
- {
- IEnumerable<DataGridViewRow> obj= (from DataGridViewRow row in grid.Rows.Cast<DataGridViewRow>()
- from DataGridViewCell cells in row.Cells
- where cells.OwningRow.Equals(row) && cells.Value==TextoABuscar
- select row);
- if (obj.Any())
- {
- grid.Rows[obj.FirstOrDefault().Index].Selected=true;
- return true;
- }
- }
- else
- {
- IEnumerable<DataGridViewRow> obj= (from DataGridViewRow row in grid.Rows.Cast<DataGridViewRow>()
- where row.Cells[Columna].Value == TextoABuscar
- select row);
- if (obj.Any())
- {
- grid.Rows[obj.FirstOrDefault().Index].Selected=true;
- return true;
- }
- }
- return encontrado;
- }
La cabecera del método recibe como parámetros el valor a Buscar, la Columna a Buscar (si no se especifica buscará en todas las columnas), y el DataGridView donde se va a buscar.
Bueno espero que os sea de utilidad.
PD: Otra forma más que interesante de hacerla es como comenta Enrique Martínez en este enlace.
Me parece una buena opcion e interesante.. pero joer… me duelen los ojos ante el fondo negro y esos colores azulados….
Hola Gracias por tu Opinion, tengo que cambiar de plugin para pegar codigo en Live Writer 🙁
porque no encuentro el metodo Cast? en Rows?
Hola Jose,
¿Qué versión de Framework estás utilizando?
Para poder utilizar el ejemplo de LINQ es necesario que este incluido el namespace System.Linq