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:
- 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:
- 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#:
- 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;
- }
- 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.