Autore: Francesco Guadagno
Sia
con Ado.NET 2.0 che con il suo predecessore 1.1 è disponibile
la classe “DataTable” che espone diversi metodi per visualizzare,
organizzare e interrogare i dati in maniera disconnessa. Molte volte
ne consegue che tale oggetto viene passato alla proprietà
“DataSource” di una DataGrid, DataList, Repeater per il
popolamento dei dati.
Uno
dei metodi più utilizzati è il metodo “Select()”
che permette di ottenere un sub-set di dati mediante il passaggio di
alcuni parametri tipici di una query SQL come la clausola “where”
piuttosto che “order by”, possibilità offerte anche dalla
classe DataView mediante l’impostazione di proprietà quali
“RowFilter” e “Sort”.
Quando
però non si vuole rinunciare alle potenzialità d’uso
delle DataTable, può risultare piuttosto scomodo ricevere,
come output del metodo “Select()”, un array di DataRow che ci
troveremo costretti a dover riconvertire in DataTable.
Il
tutto viene risolto con un metodo pubblico di questo tipo:
public
static void
DataTableSelect(ref DataTable
SourceDataTable, string
filterExpression, string sort)
{
if
(sort != null)
{
DataRow[]
drSelect = SourceDataTable.Select(filterExpression, sort);
SourceDataTable
= DataRowToDataTable(drSelect,SourceDataTable.Clone());
}
else
{
DataRow[]
drSelect = SourceDataTable.Select(filterExpression);
SourceDataTable
= DataRowToDataTable(drSelect, SourceDataTable.Clone());
}
}
Il
metodo seguente è del tutto analogo, ma senza il
parametro “sort”, richiama il primo.
public
static void
DataTableSelect(ref DataTable
SourceDataTable, string
filterExpression)
{
DataTableSelect(ref
SourceDataTable, filterExpression, null);
}
Entrambe
i metodi fanno riferimento ad un ulteriore metodo (dichiarabile anche
come private) che si occupa della conversione dell’array di DataRow
in un DataTable.
public
static DataTable
DataRowToDataTable(DataRow[] arrDataRow,
DataTable dtTarget)
{
//Controllo
if
(arrDataRow.Length > 0)
{
if
(arrDataRow[0].ItemArray.Length != dtTarget.Columns.Count)
return
dtTarget;
}
DataRow
drNew = null;
foreach
(DataRow dr in
arrDataRow)
{
drNew
= dtTarget.NewRow();
drNew.ItemArray
= dr.ItemArray;
dtTarget.Rows.Add(drNew);
}
return
dtTarget;
}
UTILIZZO
DataTable
dt = [....output Query....]
DataTableSelect(ref
dt,"codice = 20");
Il
DataTable dt, risulta già filtrato e conserva la struttura.