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 />