Il control ObjectDataSource per l'accesso a classi di business con il GridView

di , in UserScript, ASP.NET 2.0, DataBinding,

Nello script #670 è stato trattato l'argomento DataSource in ASP.NET 2.0, che non sono altro che controlli da inserire direttamente nella pagina per accedere ad una fonte dati e per il popolamento di web control come il GridView. In questo breve script sarà trattato l'ObjectDataSource, che è un DataSource per l'accesso ai dati a classi di tipo business.

L'ObjectDataSource ha tra le sue proprietà le seguenti indispensabili per il popolamento di un web control con questo tipo di DataSource:
- TypeName
- SelectMethod

Nella prima proprietà dovremo inserire il nome della classe business utilizzata, in SelectMethod la funzione che restituisce i dati. Questa funzione dovrà restituire un oggetto che esponga l'interfaccia IEnumerable (come DataTable, DataView o DataSet).

Per l'esempio ho creato una classe semplice di nome Articolo che espone di proprietà Codice e Descrizione per la definizione di un ipotetico articolo:

public class Articolo
{
  private int _codice;
  private string _descrizione;

  public int Codice
  {
    get { return _codice; }
    set { _codice = value; }
  }
  public string Descrizione
  {
    get { return _descrizione; }
    set { _descrizione = value; }
  }
  public Articolo(int codice,string descrizione)
  {
    _codice = codice; _descrizione = descrizione;
  }
}

Per memorizzare una lista di articoli ho creato una classe ereditandola dalla classe Collection<>, in cui definisco di default il tipo di oggetto che è possibile memorizzare (in questo caso, Articolo):

public class myCollection : System.Collections.ObjectModel.Collection<Articolo>
{
  public System.Collections.Generic.IList<Articolo> Lista()
  {
    return base.Items;
  }
}

La funzione Lista() resituisce la lista di tutti gli articoli memorizzati in questa classe e che sarà richiamata dall'ObjectDataSource.

Prima di passare alla costruzione dell'esempio vero e proprio, alcune note sul funzionamento dell'ObjectDataSource. Una volta richiesta la pagina contenente questo oggetto, al momento di richiamare la funzione memorizzata in SelectMethod il DataSource istanzia internamente una nuova classe con il nome preso dalla proprietà TypeName, richiamandone il nome della funzione.

Questo approccio ha la limitazione di dover creare e popolare i dati nella classe business al momento del richiamo della funzione SelectMethod.

La soluzione più semplice è poter passare in modo quasi diretto l'istanza della classe business interessata senza altri artifizi e trucchi vari. Questo è possibile grazie all'evento "OnObjectCreating". Ecco un esempio completo di una pagina che popola la classe business e che mostra i dati con un ObjectDataSource in un GridView:

<script runat="server" Language="C#">
  myCollection az_collection = null;
  void Page_Load()
  {
    myCollection coll = new myCollection();
    coll.Add(new Articolo(1, "a1"));
    coll.Add(new Articolo(2, "b2"));
    coll.Add(new Articolo(3, "c3"));
    coll.Add(new Articolo(4, "d4"));
    az_collection = coll;
  }
  protected void ObjectDataSource1_ObjectCreating(object sender, ObjectDataSourceEventArgs e)
  {
    e.ObjectInstance = az_collection;
  }
</script>
<form id="form1" runat="server">
<div>
 <asp:ObjectDataSource
    ID="ObjectDataSource1"
    runat="server"
    SelectMethod="Lista"
    TypeName="myCollection"
    OnObjectCreating="ObjectDataSource1_ObjectCreating" />
    <asp:GridView ID="GridView1" runat="server" DataSourceID="ObjectDataSource1" />
</div>
</form>

Nell'evento Page_Load viene creata una nuova istanza della classe myCollection e vengono inseriti dei dati fittizi. L'istanza di questa classe viene memorizzata nell'oggetto az_collection, visibile in tutta la pagina. Quando l'ObjectDataSource popola il GridView richiamerà l'evento OnObjectCreating e in esso verrà restituita l'istanza prima memorizzata.

Commenti

Visualizza/aggiungi commenti

Il control ObjectDataSource per l'accesso a classi di business con il GridView (#777) 710 3
| Condividi su: Twitter, Facebook, LinkedIn, Google+

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi