Solución: Utilizar el BindingSource.
Una de las mejores formas de filtrar datos que ya están cargados en un DataGridView es usando el BindingSource, sirve para mostrar una cantidad definida de registros o para reducir la cantidad de datos a procesar, todo depende de cómo se lo utilice. Para un buen ejemplo del su utilización, se puede encontrar aquí: Filtar un control DataGridView
Por mi parte, resumiré las partes importantes, intentando explicar lo más relevante.
Creé un Procedimiento en el cual tengo un DataGridView con datos enlazados y un TextBox en donde el usuario escribirá lo que se desea filtrar, por ejemplo, el nombre de una ciudad.
Private Sub Aplicar_Filtro() 'Nota: Recordar que se debe asignar el BindingSource al DataGridView antes de realizar este procedimiento por medio del DataSource ' verificar que el DataSource no esté vacío If BindingSource.DataSource Is Nothing Then ' si no hay registros cambiar el color del TextBox TextBox1.BackColor = Color.Red Exit Sub End If Try Dim filtro As String = String.Empty 'la variable filtro debería contener algo así: "[Ciudad] like '%CANADA%'" filtro = "[Ciudad] like '%" & TextBox1.Text.Trim & "%'" ' asignar el criterio a la propiedad Filter del BindingSource BindingSource.Filter = filtro 'El filtro funciona parecido a una sentencia select del SQL en la parte del where 'El filtro en realidad es: campo_del_datagridview = variable_a_buscar If BindingSource.Count = 0 Then ' si no hay registros cambiar el color del TextBox TextBox1.BackColor = Color.Red Else TextBox1.BackColor = Color.White End If Catch ex As Exception 'Errores MsgBox(ex.Message.ToString, MsgBoxStyle.Critical) End Try End Sub
Luego, este procedimiento es llamado desde el TextBox, para que se actualice cada vez que el usuario escriba algo.
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged Aplicar_Filtro() End Sub