Associazione dati e visualizzazione dei dati mediante un controllo ObjectList

È possibile utilizzare il controllo mobile ASP.NET ObjectList per garantire una visualizzazione dei dati più versatile. Il controllo consente due visualizzazioni dell'origine dati, un elenco in cui è riportato un riepilogo di ciascun elemento e una visualizzazione con i dettagli degli elementi. È possibile definire in modo esplicito i campi dell'elenco che si desidera visualizzare per ciascun elemento oppure generarli automaticamente dall'origine dati. Per impostazione predefinita, il controllo consente di generare un campo per ciascun campo dell'origine dati, nell'ordine in cui viene visualizzato all'interno dei dati. Il nome di ogni campo generato automaticamente viene utilizzato come titolo del campo.

È possibile associare i dati di un controllo ObjectList a un elemento DataView o DataSet. Per associare i dati di un controllo mobile ObjectList a un elemento DataView, impostare la proprietà DataSource e chiamare il metodo DataBind per eseguire l'associazione dati. Se, ad esempio, è presente un elemento DataSet con una tabella denominata Titles, è possibile utilizzare le istruzioni riportate di seguito per eseguire l'associazione dati.

myObjectList.DataSource = ds.Tables["Titles"].DefaultView;
myDataList.DataBind();

In alternativa, per associare i dati direttamente a un elemento DataSet, è necessario impostare la proprietà DataMember sul nome della tabella. L'esempio che segue equivale a quello precedente.

myObjectList.DataSource = ds;
myObjectList.DataMember = "Titles";
myObjectList.DataBind();

È anche possibile impostare un campo di elemento su un valore composto da diverse proprietà dell'elemento di dati. A questo scopo, è possibile eseguire l'override dell'evento ItemDataBind del controllo e impostare il campo a livello di codice. Nell'esempio che segue il campo Summary viene impostato su una combinazione di titolo e prezzo di un libro.

private void ObjectList_OnItemDataBind(Object sender, 
  ObjectListDataBindEventArgs e)
{
   e.ListItem["Summary"] = String.Format( String.Format ("{0} – ${1}", 
      DataBinder.Eval(e.DataItem, "title"),
      DataBinder.Eval (e.DataItem, "price")));
}

È inoltre possibile controllare il modo in cui viene eseguito il rendering di ciascun elemento nell'elenco. Per impostazione predefinita, nell'elenco è il primo campo a rappresentare ciascun elemento. Tuttavia, è possibile impostare la proprietà LabelField su qualsiasi campo definito o generato in modo automatico, incluso un campo non visibile nella visualizzazione Dettagli. Avvalendosi del precedente esempio, è possibile utilizzare il campo Summary come etichetta di un elemento, nascondendolo poi nella visualizzazione Dettagli.

Esecuzione dell'associazione dati in un controllo ObjectList

Un controllo ObjectList consente di visualizzare il contenuto solo se è associato a un'origine dati. L'origine dati può essere di qualsiasi tipo, purché consenta l'implementazione dell'interfaccia IEnumerable. Tuttavia, ogni oggetto dell'origine dati deve appartenere alla stessa classe o ereditare dalla stessa classe comune. Se la proprietà AutoGenerateFields è impostata su true, gli oggetti dell'origine dati devono appartenere alla stessa classe.

Per ciascun oggetto dell'origine dati, il controllo consente di creare una classe ObjectListItem e di archiviarla nel relativo insieme di membri Items. L'insieme può essere esaminato, ma non modificato, mediante l'applicazione.

Tutte le proprietà a cui fa riferimento l'elenco di oggetti devono essere di tipo pubblico e appartenere a una classe comune a tutti gli oggetti dell'origine dati. Tutte le proprietà a cui fanno riferimento i campi devono inoltre essere di tipo associabile. I tipi associabili validi sono String, DateTime, Currency, Decimal e l'insieme dei tipi primitivi.

Per ciascun oggetto dell'origine dati vengono effettuati i seguenti passaggi di associazione dati:

  1. Per ciascun campo, viene utilizzata la proprietà DataField del campo per determinare quale proprietà dell'oggetto dati ricercare. Ogni valore viene salvato in ObjectListItem come valore di campo indicizzato.

  2. Una volta associati tutti i campi secondo la procedura descritta, viene chiamato uno dei gestori eventi ItemDataBind definiti per il controllo. Tale gestore può essere utilizzato per eseguire un'associazione dati più complessa e impostare i valori in ObjectListItem.

    Nota   Per apportare alcune modifiche a un controllo ObjectList è necessario riassociarne i dati. Tra queste operazioni sono incluse l'aggiunta e la rimozione di campi e la modifica delle proprietà DataField e DataFormatString di un campo.

Avvio della generazione automatica dei campi durante l'associazione dati

Durante l'associazione dati, se la proprietà AutoGenerateFields è impostata su true, il controllo consente di esaminare l'origine dati e di generare automaticamente i campi. Se l'origine dati è un elenco tipizzato di tipo ITypedList, vengono esaminate le informazioni relative al tipo. Altrimenti, vengono esaminate le informazioni sui tipi del primo oggetto dell'elenco.

Per ciascuna proprietà pubblica associabile del tipo esaminato, viene generato un campo associato alla proprietà. Tuttavia, i campi vengono associati durante l'associazione dati. Se si apportano modifiche a un campo oppure si aggiungono o rimuovono campi, è necessario riassociare le proprietà.

Per impostazione predefinita, i campi generati automaticamente sono visibili, presentano come titolo il nome della proprietà e per essi viene utilizzata la formattazione predefinita. Tali caratteristiche possono essere modificate a livello di codice. Il titolo del campo può essere specificato aggiungendo un attributo ObjectListTitleAttribute alla proprietà. Se, ad esempio, l'oggetto presenta una proprietà dichiarata come [ObjectListTitle("Address")]myAddress, il titolo del campo generato sarà "Address".

Se nel controllo ObjectList sono presenti campi definiti esplicitamente, i campi generati automaticamente vengono aggiunti dopo di essi.

Associazione di comandi in un elenco di oggetti

Il controllo ObjectList consente di associare un insieme di comandi a un elemento. Ogni comando presenta una proprietà Name, utilizzata per identificare in modo univoco il comando, e una proprietà Text, utilizzata per eseguire il rendering del comando.

I comandi possono essere definiti in due modi:

  • In maniera dichiarativa, utilizzando gli elementi figlio <Command> in un controllo ObjectList.
  • A livello di codice, generando oggetti ObjectListCommand e aggiungendoli all'insieme di membri Commands del controllo.

Per impostazione predefinita, tutte gli elementi dell'elenco condividono lo stesso insieme di comandi. Tuttavia, prima di eseguire il rendering dell'insieme di comandi relativo a un determinato elemento, viene generato l'evento OnShowItemCommands. Tale evento può essere utilizzato da un gestore eventi per modificare l'insieme dei comandi relativo all'elemento in questione.

Quando l'utente seleziona un comando, viene generato un evento ItemCommand con le informazioni relative all'elemento selezionato e il nome del comando scelto.

Anche se si definisce un comando predefinito per un elemento, è necessario includere un comando con lo stesso nome nell'insieme di membri Commands. Se il controllo non è in grado di eseguire il rendering di un elemento di interfaccia utente in cui sia incluso un collegamento al comando predefinito, deve visualizzare tale comando come parte dell'insieme dei comandi.

Accesso ai valori dei campi di un elemento dell'elenco

Se si associa un gestore eventi a un controllo ObjectList, gli elementi dell'elenco vengono rappresentati come elementi interattivi; facendo clic su uno di essi viene generato un evento che consente di recuperare l'azione appropriata all'elemento in questione. Durante l'associazione dati, ciascun campo viene associato alla proprietà corrispondente.

Per recuperare il valore di un campo da un oggetto ObjectListItem, utilizzare la sintassi riportata di seguito, in cui lstItemè un ObjectListItem.

lstItem[fieldName]

Se, ad esempio, si accede a un database di dipendenti, il codice potrebbe essere simile alle istruzioni che seguono.

ObjectList1.DataSource = ds.Tables["Employees"].DefaultView;
ObjectList1.DataMember = "Employees";
ObjectList1.LabelField = "LastName";

Associazione dati nei modelli ObjectList

Nel controllo ObjectList è possibile definire diversi modelli per personalizzare l'esperienza dell'utente. Se si sta eseguendo l'associazione dati inline in tali modelli, avvalersi della seguente sintassi:

<%#((ObjectListItem)Container)["BookName"]%> 

Per associare i dati di tutti i modelli, è possibile utilizzare anche il metodo DataBinder.Eval, come illustrato di seguito.

<%#DataBinder.Eval(((ObjectListItem)Container).DataItem,"fieldname")%>

Vedere anche

Accesso ai dati mediante i controlli elenco