Non preoccuparti, qui da noi sei nel posto giusto! ;-)
Allora: Per prima invece di usare un LinqDataSource devi usare direttamente il DataContext, altrimenti non puoi farlo, perché:
come seconda cosa: ne Linq To Sql, ne Linq to Entity implementano la clusola del database "IN".
Quindi se provi a prendere i dati dal datacontext nel seguente modo:
N.B: Nel codice seguente ho sostituito la parentesi angolare aperta con un "$" altrimenti non si vedeva sul post, per questioni hi HTML...
-------------------------------------
NorthwindDataContext nw = new NorthwindDataContext();
String[] myValues = new String[] { "London", "Madrid", "Buenos Aires" };
var qry = from t in nw.Customers
join val in myValues on t.City equals val
select t;
Ottieni il seguente errore:
System.NotSupportedException was unhandled
Message="Local sequence cannot be used in LINQ to SQL implementation of query operators except the Contains() operator."
-------------------------------------
Questo perchè l'espressione che verrebbe generata non è supportata (lo sarà col NET Framework 4.0).
Per ovviare a questo inconveniente devi crearti tu un l'espressione corretta e lo fai con la seguente funzione (che è scritta in c# e se qualche anima buona vuole tradurtela in VB...):
-------------------------------------
public static Expression$Func$TElement, bool>> BuildContainsExpression$TElement, TValue>(
Expression$Func$TElement, TValue>> valueSelector, IEnumerable$TValue> values)
{
if (null == valueSelector) { throw new ArgumentNullException("valueSelector"); }
if (null == values) { throw new ArgumentNullException("values"); }
ParameterExpression p = valueSelector.Parameters.Single();
if (!values.Any())
{
return e => false;
}
var equals = values.Select(value => (Expression)Expression.Equal(valueSelector.Body, Expression.Constant(value, typeof(TValue))));
var body = equals.Aggregate$Expression>((accumulate, equal) => Expression.Or(accumulate, equal));
return Expression.Lambda$Func$TElement, bool>>(body, p);
}
-------------------------------------
Ora hai tutti gli elementi per fare ciò che ti server:
Al page load carichi i dati da tuo datacontext:
-------------------------------------
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DataClassesDataContext dtc = new DataClassesDataContext();
GridView1.DataSource = dtc.TbContattis;
GridView1.DataBind();
}
}
-------------------------------------
Metti un bottone e all'evento click usi il seguente codice:
protected void Button1_Click(object sender, EventArgs e)
{
DataClassesDataContext dtc = new DataClassesDataContext();
List$String> filtri = new List$string>();
//Qui scorri gli elementi selezionati sulla tua listbox e li aggiungi alla collezione "filtri":
filtri.Add(elemento1);
filtri.Add(elemento2);
filtri.Add(elementoN ...);
GridView1.DataSource = dtc.NomeTabella.Where(BuildContainsExpression$NomeTabella,
string>(exp => exp.CampoTabella, filtri));
GridView1.DataBind();
}
Stessa cosa per i campi data e ora, puoi passare a filtri una stringa: "dd/MM/yyyy hh:mm:ss".
Buon divertimento!