In
ASP.NET 1.x per potere utilizzare come fonte dati un file XML per sfruttare il binding con un
DataGrid o un
DataList dovevamo per forza usare un
DataSet che ha il metodo
ReadXml.
DataSet ds = new DataSet();
Datagrid1.DataSource = ds.ReadXml(“filetest.xml”);
Datagrid.DataBind();
Ora in
ASP.NET 2.0 è stato introdotto un nuovo oggetto
XmlDataSource che permette di usare il binding tra un file
XML ed un controllo che ha questa proprietà.
Per poter utilizzare questo nuovo controllo è importante la struttura del file
XML, per ogni nodo(che sarà il nostro record) bisogna creare tanti attributi quante sono le colonne che si vogliono utilizzare, per esempio:
<?xml version="1.0" standalone="yes"?>
<listapc>
<pc id="1" produttore="Dell" tipologia="notebook/desktop" vendita="on-line"></pc>
<pc id="2" produttore="HP" tipologia="notebook/desktop" vendita="on-line/negozio"></pc>
<pc id="3" produttore="Toshiba" tipologia="notebook" vendita="on-line/negozio"></pc>
</listapc>
Mentre questo file non è utilizzabile:
<?xml version="1.0" encoding="UTF-8"?>
<listapc>
<pc>
<id>1</id>
<produttore>Dell</produttore>
<tipologia>notebook/desktop</tipologia>
<vendita>on-line</vendita>
</pc>
</listapc>
Questo secondo file
XML anche se well-formed per il controllo
XmlDataSource non è utilizzabile perchè, è come se fossero 4 record, ed infatti se provate ad associare questo file ad una
GridView (la nuova
DataGrid di
ASP.NET 2.0) otterrete questo errore:
The data source for GridView with id 'GridView1' did not have any properties or attributes from which to generate columns. Ensure that your data source has content.Fatte queste premesse vediamo come funziona questo nuovo controllo.
Come prima cosa si deve creare un file
XML simile a quello precedentemente visualizzato e lo inseriamo nella nuova cartella
App_Data che è quella predisposta a contenere i dati e dove ci sono impostati correttamente i permessi lettura e scrittura.
Poi si deve creare una nuova
Web Form, tramite il drag&drop trasciniamo sulla webform il nuovo oggetto
XmlDataSource e poi clicchiamo su
"Configure Data Source" e dovreste trovarvi ad una situazione simile:
Come si può notare ci sono tre proprietà:
1. Data File che il path del file
XML.
2. Transform file che permette di selezionare un file
XSL per la trasformazione.
3. XPath expression che permette di inserire una espressione
XPATH per filtrare i dati.
Dopo aver scelto il file, sempre tramite il drag&drop inserite, una
GridView e selezionate come
DataSource iil controllo precedentemente inserito ed in automatico vengono create le colonne.
Quindi sulla pagina aspx dovreste avere, un struttura simile:
<div>
<asp:XmlDataSource ID="XmlDataSource1" runat="server" DataFile="~/App_Data/test2.xml">
</asp:XmlDataSource>
</div>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="XmlDataSource1">
<Columns>
<asp:BoundField DataField="id" HeaderText="id" SortExpression="id" />
<asp:BoundField DataField="produttore" HeaderText="produttore" SortExpression="produttore" />
<asp:BoundField DataField="tipologia" HeaderText="tipologia" SortExpression="tipologia" />
<asp:BoundField DataField="vendita" HeaderText="vendita" SortExpression="vendita" />
</Columns>
</asp:GridView>
Per capire come funziona la proprietà
XPATH Expression, abilitiamo la selezione nella
GridView e come
datakey associamo l'attributo id e gestiamo l'evento
SelectedIndexChanged della
GridView.
Nella pagina aspx aggiungiamo le due proprietà:
OnSelectedIndexChanged="GridView1_SelectedIndexChanged"
DataKeyNames="id"
Poi lato codice creaiamo il gesture dell'evento
SelectedIndexChanged:
protected void GridView1_SelectedIndexChanged(object sender,
EventArgs e)
{
string id = (string)GridView1.DataKeys[GridView1.SelectedIndex].Value;
XmlDataSource1.XPath = string.Format("//*[@id='{0}']", id);
}
Recuperiamo l'ID selezionato e lo passiamo alla query
XPATH che recupera tutti i nodi che hanno l'attributo selezionato.