27.06.2014 Views

Informatica Medica Anno Accademico 2013-2014 Prof. Mauro Giacomini

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Informatica</strong> <strong>Medica</strong><br />

<strong>Anno</strong> <strong>Accademico</strong> <strong>2013</strong>-<strong>2014</strong><br />

<strong>Prof</strong>. <strong>Mauro</strong> <strong>Giacomini</strong>


Organizzazione del codice<br />

• Separazione codice-contenuto<br />

• Code-behind, dietro l’interfaccia in un qualsiasi linguaggio<br />

• Controlli Utente<br />

• Creazione di controlli specifici con relativa logica e<br />

riutilizzabili in più punti delle nostre applicazione<br />

• Creazione Componenti<br />

• Concentra la logica applicativa in elementi indipendenti<br />

dall’interfaccia utente


Separazione codice – contenuto<br />

• Codice separato dall’interfaccia HTML<br />

• Codice in qualsiasi linguaggio<br />

• Necessaria la creazione di due file, uno per l’interfaccia e<br />

uno per la logica applicativa<br />

• Nell’interfaccia necessaria la direttiva Page che specifica il<br />

nome del file di codice e la classe usata<br />

• Es<br />


Esempio_a (1)<br />

Code-behind:<br />

Imports System<br />

Imports System.Web<br />

Imports System.Data<br />

Imports System.Data.SQLClient<br />

Imports System.Web.UI.Page<br />

Public Class Dati<br />

Public Function getData () as DataSet<br />

Dim ds as DataSet<br />

Dim conn as SQLConnection<br />

Dim cmd as SQLDataAdapter<br />

Definisce una classe Dati<br />

Con una funzione<br />

pubblica getData che<br />

legge dati da un DB e li<br />

restituisce all’interfaccia<br />

con un DataSet<br />

conn = New SQLConnection (“server = MyServer;<br />

uid=sa;pwd=;database=pubs”)


Esempio_a (2)<br />

cmd = New SQLDataAdapter (“SELECT * From Authors”,<br />

conn)<br />

ds = New DataSet ()<br />

cmd.Fill (ds, “Autori”)<br />

return (ds)<br />

End Function<br />

End Class


Esempio_a (3)<br />

<br />

<br />

Sub Page_Load (scr as Object, e as EventArgs)<br />

Dim ds DataSet<br />

ds = getData()<br />

dgAutori.datasource = ds.Tables(“Autori”).DefaultView<br />

dgAutori.DataBind()<br />

End Sub<br />

<br />

Script che richiama<br />

il code-behind<br />

dell’esempio_a 1-2


Esempio_b (4)<br />

<br />

<br />

<br />

<br />

<br />

Testo HTLM di una form con un bottone il cui evento click è<br />

collegato alla procedura Scrivi dichiarata in un file code-behind


Esempio_b (5)<br />

Imports System<br />

Imports System.Web<br />

Imports System.Web.UI.WebControls<br />

Imports System.Web.UI.Page<br />

Partial Class Eventi<br />

Public lbl as Label<br />

Public txt as TextBox<br />

Code-behind con una<br />

classe Eventi che gestisce<br />

con la procedura pubblica<br />

Scrivi, l’evento di click del<br />

bottone dell’interfaccia<br />

descritta in Esempio_b (4)<br />

Public Sub Scrivi (scr as Object, e as EventArgs)<br />

End Sub<br />

End Class<br />

lbl.Text = txt.Text<br />

I controlli dell’interfaccia che devono<br />

essere modificati in questa procedura,<br />

sono dichiarati come pubblici in una parte<br />

della classe non visibile al programmatore


Esempio (6)<br />

<br />

Public btn as button<br />

Public Sub Scrivi (scr as Object, e as EventArgs)_<br />

Handles btn.Click<br />

End Sub<br />

lbl.Text = txt.Text<br />

Se si vuole un’interfaccia del tutto scollegata dal codice, si deve<br />

dichiarare il bottone nell’interfaccia senza dichiarare nell’interfaccia<br />

quale procedura gestirà il suo evento click. Il bottone viene quindi<br />

dichiarato come pubblico nel file del code-behind (parte nascosta) e la<br />

procedura deve esplicitamente di gestire (Handles) il click del bottone<br />

stesso.


Controlli utente<br />

• Parte di pagina ASP.NET importata e usata da un’altra pagina ASP.NET<br />

come se fosse con controllo server.<br />

• Fondamentali per il riutilizzo del software e per partizionare le<br />

funzionalità in un’interfaccia web<br />

• Ogni istanza di un controllo utente ha un suo proprio namespace in<br />

modo che uno stesso controllo utente può essere usato più volte, anche<br />

nella stessa pagina.<br />

• Il linguaggio di programmazione è libero ed indipendente dal<br />

linguaggio usato nell’interfaccia<br />

• I file di controlli utente contengono anche parti dell’interfaccia, sono<br />

salvati in file .ascx e possono anche avere il meccanismo del codebehind<br />

• Devono essere integrati in altre form, quindi non devono contenere<br />

, o


Esempio di Controllo Utente<br />

<br />

<br />

<br />


Esempio di Controllo Utente (2)<br />

<br />

Public Property Numero As Integer<br />

Get<br />

Return CInt (txtNum.Text)<br />

End Get<br />

Set<br />

txtNum.Text = Value.ToString()<br />

End Set<br />

End Property<br />


• Contiene una casella di testo e due controlli di validazione<br />

• Casella di testo per inserire un valore obbligatorio<br />

numerico compreso da 0 e 99<br />

• Visibili all’esterno solo gli oggetti Public (proprietà Numero<br />

che corrisponde al valore della proprietà Text della casella<br />

di testo)<br />

• Dentro alla direttiva Control possiamo inserire i comandi<br />

per gestire il code-behind<br />


Inserimento controllo<br />

• Un controllo utente è incluso con la direttiva<br />

<br />

• TagPrefix: definisce un namespace univoco per il<br />

controllo utente<br />

• TagName: nome del controllo<br />

• Src: file dove sta il controllo con l’eventuale percorso


Uso controllo<br />

• Per posizionare sulla pagina una o più istanze del<br />

controllo:<br />

<br />

<br />

• Per accedere alle proprietà:<br />

lblSomma.Text = (Numero1.Numero +<br />

Numero2.Numero).ToString()<br />

• Per un valore predefinito<br />


Dichiarazione componente<br />

Namespace Nome_Componente<br />

Public Class Nome_Classe<br />

…..<br />

End Class<br />

Public Class Nome_Classe_1<br />

….<br />

End Class<br />

End Namespace<br />

vbc /t:library /out:componente.dll componente.vb<br />

vbc /t:library /out:componente.dll<br />

/r:System.Data.dll componente.vb<br />

Esempio di dichiarazione di<br />

un componente<br />

Direttive per la compilazione<br />

L’assembly che si ottiene va<br />

posto nella directory reale<br />

collegata alla directory<br />

virtuale o in una directory /bin<br />

dentro di essa.


Esempio<br />

Import System.Data<br />

Import System.Data.SqlClient<br />

Namespace DatiAziendali<br />

Public Class OrdiniClienti<br />

Public Function CaricaDati (conn As SQLConnection)_<br />

as DataSet<br />

Dim daClienti as SqlDataAdapter =<br />

New SqlDataAdapter (“Select * From<br />

Clienti”, conn)<br />

Dim daOrdini as SqlDataAdapter =<br />

New SqlDataAdapter (“Select * From<br />

Ordini”, conn)<br />

Dim relClientiOrdini as DataRelation<br />

Dim ds as DataSet = New DataSet()


Esempio (2)<br />

daClienti.Fill (ds, “Clienti”)<br />

daOrdini.Fill (ds, “Ordini”)<br />

relClientiOrdini = ds.Relations.Add<br />

(“ClientiOrdini”, ds.Tables(“Clienti”).Columns(“ID”),<br />

ds.Tables(“Ordini”).Columns(“IDCliente”))<br />

return ds<br />

end Function<br />

end Class<br />

end Namespace


Uso in code-behind<br />

Import DatiAziendali<br />

Dim x as New OrdiniClienti<br />

‘Senza import<br />

Dim x as New DatiAziendali.OrdiniClienti<br />

Dim ds DataSet<br />

ds= x.CaricaDati(Conn)<br />

Uso in aspx<br />

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!