Bueno, abundando un poco en lo que dice .seb; hay muchas maneras de lograrlo, una es filtrando los objectdatasource, probablemente la que yo haria seria traer nada más los registros que necesite y esto se logra modificando un poco tu query, podrías por ejemplo agregar un argumento a tu método y en base a este/os argumentos construír el query, no se, a mi por ejemplo me gustaría regresar un DataView:
Código:
public DataView List(string ciudad, string estado)
{
StringBuilder query = new StringBuilder();
int argCount = 0;
query.Append("SELECT * FROM tabla ");
if ( ciudad.Length > 0 )
{
if ( argCount > 0 )
query.Append(" AND ");
else
query.Append(" WHERE ")
query.Append(" tabla_ciudad = @ciudad ");
argCount++;
}
if ( estado.Length > 0 )
{
if ( argCount > 0 )
query.Append(" AND ");
else
query.Append(" WHERE ");
query.Append(" campo_estado = @estado ");
argCount++;
}
.
.
.
}
Algo así es la idea, desde luego que quizás basado en esos argumentos, podrías traer todos los registros y quizás utilizar el método filter del dataview para filtrarlo, podrías quizás crear sendas propiedades públicas y privadas de filtro en la clase.
Código:
//en el evento de tu form que se encargue de hacer la consulta
Clase objeto = new Clase();
//llamada por argumentos
objeto.List(textbox.text, textbox2.text);
//si tuvieramos una propiedad filtro
objeto.filtro = textbox.text;
dataView = objeto.List();
Y asi podria haber un sinfin de soluciones, lo importante en este caso es que tu clase actue como una caja negra, a la capa que se encarga de comunicarse con tu capa de datos no le interesa como lo hace, solo le interesa que lo haga.
Saludos