E’ un ambiente di esecuzione simile alla Java Virtual Machine specifico per ogni tipo di architettura;significa che il codice e’ potenzialmente indipendente dal S.O. semplicemente adottando un framework specifico.
E’ costituito da due parti principali:
§ CLR
§ Libreria di classi .NET
Per vedere i FrameWork installati andare sotto: C:\WINNT\Microsoft.NET\Framework
Introduce,per la prima volta,il concetto di code managed,ovvero il vantaggio di far girare codice all’interno di un contenitore che gestisca la memoria ed i criteri di accesso alle risorse,concentrandosi maggiormente sulle funzionalità del programma.
Obbligatorio Mdac 2.6,consigliato 2.7.
Sdk : per la creazione e l’esecuzione di applicazioni in .NET Framework(800 mb)
Runtime: solo per l’esecuzione di applicazioni in .NET Framework(circa 20 mb)
Common Language Runtime fornisce un ambiente di runtime per l’esecuzione di codice .Net.Il CLR si occupa della gestione della memoria attaverso il garbage collection,il controllo dei tipi,gestisce l’eccezioni,contiene l’engine del Debug,il JIT,…
La GAC(global assembly cache) si trova in C:\WINDOWS\ASSEMBLY
Quando conviene installare l’assembly nella GAC:
se applicazioni diverse devono far uso dello stesso assembly
consente il massimo livello di protezione per gli assembly visto che sit trova nella cartella windows
se si vogliono utilizzare piu versioni dello stesso assembly(versioning)
Per aggiungere un assembly copiarlo fisicamente(drag and drop) nella CAG
oppure:
in Net Command Prompt : “gacutil /i myAssembly.dll”
oppure usa .Net FrameWork Configurationd(Administrative Tools)
N.B. l’assembly deve essere firmato con uno strong name.
Quando un client rilascia l’ultimo riferimento ad un oggetto,questo non viene rimosso dalla memoria,ma ci pensa il GC in un momento indefnito in futuro. E’ un servizio che modifica in automatico la sua priorità di azione in base alla memoria utilizzata,piu’ e’ occupata e piu’ si “affretta” a distruggere gli oggetti fuori ambito.
Microsoft Intermediate Language e’ un formato di compilazione simile a quello binario perche’ contiene istruzioni di basso livello,differente perché contiene dipendenze da determinati sist. operativi.Cio’ significa che occorre comunque eseguire un ciclo finale di compilazione JIT(just in time) per trasformare il file in istruzioni assembly specifiche per il computer.
Il manifest,contenuto in ogni assembly,contiene le informazioni(Metadati)
che descrivono i contenuti dell’assembly.
Contiene:
Assembly name,version,culture,strong nameàidentità dell’assembly,
lista di tutti i file nell’assembly,lista degli assembly referenziati.
Le informazioni dell’assembly possono essere cambiate nell’AssemblyInfo.cs.Puo’ risiedere in un file Exe/Dll separato oppure nello stesso assembly.
E’ l’insieme delle classi base gerarchiche che possono essere ereditate.
Queste classi organizzate in contenitori detti NameSpace fornisco funzionalità di base che gli sviluppatori possono riutilizzare.
Esistono classi che forniscono l’accesso ai dati,servizi di sistema e classi che costituiscono la base di Asp.Net tra cui la classe Page contenuta in System.Web.UI dalla quale derivano tutte le pagine Asp.net
1. Controllo Html per solo eventi lato client
<INPUT ID=”ENTER” TYPE=”BUTTON”>
2. Controllo Html per eventi lato client-server
<INPUT ID=”ENTER” TYPE=”BUTTON” RUNAT=”SERVER”>
3. Controllo web per solo eventi lato server
<ASP:BUTTON ID=”ENTER” RUNAT=”SERVER”>
attraverso ilasm e' possibile ricompilare l'assembly partendo dal codice "il"
modificato con ilDasm (c:\windows\Microsoft.Net\Framework\v1.0.3705)
attraverso ildasm e' possibile generare il codice "il" di un assembly,editarlo
col notepad,modificarlo. (c:\programmi\VisualStudio.Net\FrameWork SDK\Bin)
visualizzatore log assembly…..
(c:\programmi\VisualStudio.Net\FrameWork SDK\Bin)
(c:\programmi\VisualStudio.Net\FrameWork SDK\Bin)
· serve per creare una coppia(KeyPair) di chiavi (pubblica-privata).
sn – k myAssembly.snk“
Copiare il file snk nella cartella dell’oggetto ed impostare nell’AssemblyInfo.cs:
[assembly: AssemblyKeyFile(“..\\..\\library.snk”)] · firma un assembly con la chiave memorizzata nel .snk
sn -R RegistrationAssm.dll TKStrongKey.snk
serve per assegnare la KeyPair,creata con SN, all’assembly.
(c:\windows\Microsoft.Net\Framework\v1.0.3705)
al /out:My.dll modulename /keyfilename:key.snk
serve per gestire la Gac,aggiungere o cancellare gli assembly
(c:\programmi\VisualStudio.Net\FrameWork SDK\Bin)
es in Net Command Prompt : “gacutil /i myAssembly.dll”
(c:\windows\Microsoft.Net\Framework\v1.0.3705)
Installa la type library di una dll dentro com+,in pratica installa un componente com sotto com+.
Simile al ILAsm ma parte dal IL per interpretare in codice C# o VB.net.
Serve per registrare (nel registro) un componente net per essere utilizzato con tecnologia COM.
Serve per determinare i permessi che un assembly richiede per essere eseguito
Native image generator crea un’ immagine in codice nativa dell’assembly IL direttamente nella gac.
Il runtime usa automaticamente l’immagine ogni volta che viene lanciato l’assembly.
Compilare un assembly con ngen migliora il tempo di startup di un’applicazione perche’ gran parte del lavoro e’ gia’ stato fatto prima con l’ngen.
ngen pippo.dll
Per vedere tutte le immagini precompilate:
ngen /show
Per rimuovere un’immagine creata:
ngen /delete pippo.dll
Permette di importare da un oggetto Com la definizione dei tipi in un oggetto .net
tlbimp C:\myDll.dll /out:C:\InterOp.dll
Permette di compilare un progetto c# da riga di comando.
csc /lib:C:\ /reference:Interop.objTB_VisualDati.dll;Interop.COMSVCSLib.dll /out:C:\ Component.dll /t:library /recurse:C:\ Component\*.cs
(c:\programmi\VisualStudio.Net\FrameWork SDK\Bin)
The XML Schema Definition tool generates XML schema or common language runtime classes from XDR, XML, and XSD files, or from classes in a runtime assembly.
Serve per firmare un assembly per evitare che venga alterato da altri programmatori
Utilizzare da riga di comando(cmd) aspnet_regiis –i (contenuto nel framework che si vuole utilizzare ).
Es: Aspnet_regiis -s W3SVC/1/ROOT/Pippo
Imposta l’ASPNET ISAPI version che deve essere utilizzato per l’applicazione pippo.
Es Aspnet_regiis –i
Reinstalla la versione di ASPNET selezionata.
Tool simile al prompt dei comandi utilizzato in sostituzione dell’ambiente Visual Studio.
Compila una classe c#(.cs) in un eseguibile o dll
Csc path/classe.cs
Eseguibile.exe
ASP.NET è event driven ed object oriented,
ASP no.
Questo vuol dire che ogni singolo oggetto in una pagina ASP.NET può
essere programmato, mentre ASP prevede un meccanismo di programmazione in-line,
ovvero con codice in linea: non si possono modificare oggetti, perchè non
esistono, ma si può influenzare l'output con codice scritto ad hoc
Il modello COM prevedeva la registrazione dei componenti prima di poterli utilizzare nelle pagine Asp.L’amministrazione remota spesso non era possibile perché bisogna lanciare la registrazione localmente sul server(regsvr32).Ad aggravare la situazione c’era il fatto che l’applicazione,quando veniva caricata,loccava i componenti,cosicche’ l’intero web server doveva essere stoppato prima che i componenti potessero essere rimossi o sostituiti.
Asp.Net risolve questi problemi permettendo che i componenti siano copiati in una directory qualsiasi,per essere automaticamente trovati in fase di runtime.Spesso questa cartella e’ /Bin localizzata sotto la root dell’applicazione(visual directory).
Infatti gli assembly sono self-describing,tipicamente senza alcuna dipendenza.
Questa tecnologia offre i seguenti vantaggi:
1. Nessuna registrazione
il componente puo’ essere deployato semplicemente copiandolo.
2. Nessun restart del server
se un componente viene sostituito,la nuova richiesta terrà conto del nuovo file.
N.B. ogni qualvolta che viene richiamata una pagina aspx,viene lanciato il processo aspnet_ws
solo sulla macchina richiamata nell’url
I provider consentono la connessione ad una fonte dati.
I managed provider sono ottimizzati per una specifica fonte dati,ma ne esiste uno che si appoggia su OleDb che consente di scrivere codice indipendente dalla fonte dati(System.Data.OleDb).
I managed provider realizzati per uno specifico database,infatti,utilizzano direttamente le librerie client del database,senza passare attraverso strati intermedi,garantendo il massimo delle performance possibili.
Ado.Net fa uso di alcuni oggetti: Connection,Command e di DataSet,DataReader e DataAdapter.
e’ usato per dialogare con il database ed e’ spesso rappresentato da un provider specifico come:SqlConnection,OleDbConnection.
Es: (using System.Data.SqlClient)
SqlConnection mySqlConnection = new SqlConnection(“server=(local)\\NetSDK;Trusted_Connection=yes;database=northwind”);
Il metodo Dispose permette la chiusura della connessione.
La differenza tra Dispose e Close consiste nel fatto che Dispose,prima di chiudere la connessione verifica che la stessa sia aperta,quindi eventualmente invoca la Close,.
La Close non effettua nessuna verifica generando un’eccezione se invocata su una connessione chiusa.
Si intende la possibilità di mantenere un gruppo di connessioni aperte verso un database.con lo scopo di condividerle tra piu’ sessioni che utilizzano la stessa stringa di connessione.
Questa tecnica consente di evitare la chiusura e l’apertura continua di connessioni verso uno specifico database per ogni sessione e consente di riciclare le stesse connessioni,limitando e massimizzando lo sfruttamento del database,riducendo i tempi di apertura di una connessione per ogni richiesta.
Con il Connection Pooling,nel momento in cui invochiamo il metodo Open su un oggetto Connection,viene estratta una connessione dal Pool ed associata all’oggetto Connection;alla chiusura della connessione,attraverso Close,la connessione non viene effettivamente chiusa,ma reinserita nel Pool di connessioni.
Per evitare il proliferare dei pool bisogna sempre utilizzare la stessa stringa di connessione,identica in ogni singolo carattere.
Esempio:
sconn=”user id=sa;password=;Initial Catalog=Northwind;server=localhost;Pooling=true”;
Parametri:
Max Pool Size:numero di connessioni memorizzabili nel Pool(default 100)
Pooling:true o false
puo’ essere utilizzato solo con Sql server 7 o successive
Contiene l’informazione(comando sql) che sara’ sottoposto al Db,spesso rappresentato da un provider specifico come:SqlCommand,OleDbCommand.
Puo’ essere eseguito attraverso uno dei tre metodi:
Viene utilizzato per Insert,Update,delete(Es. 1)
Restituisce un intero che indica il numero di righe affette
Viene utilizzato nel caso in cui il comando ritorna esclusivamente un unico valore(Es. 2)
Es. 1:
SqlCommand mySqlCommand = new SqlCommand(“INSERT INTO Customers Values (‘ABC’,’ABC Company’)”, mySqlConnection);mySqlConnection.Connection.Open()mySqlConnection.ExecuteNonQuery()mySqlConnection.Connection.Close()
Es. 2:
SqlCommand mySqlCommand = new SqlCommand(“SELECT COUNT(REGIONID) FROM REGION”,mySqlConnection);mySqlConnection.Connection.Open()mySqlConnection.ExecuteNonQuery()
mySqlConnection.Connection.Close()
e’ un recordset disconnesso che non sa nulla riguardo alla connessione.Alll’interno c’e’ tutto quello che possiamo trovare in un db;tabelle,viste,relazioni,constraints,dati....
Possiamo operare sul DataSet e poi riconciliare le modifiche sul Db.
Es:
DataSet ds = new DataSet();mySqlCommand.Fill(ds, “Authors”);
Serve per caricare i dati nel DataSet.
Fa da ponte tra il DataSet e la Connection,estrae i dati attraverso un’istruzione sql e riempie il dataset con il metodo Fill.E’ spesso rappresentato da un provider specifico come:SqlDataAdapter,OleDbDataAdapter.
Es:
SqlDataAdapter da = new SqlDataAdapter(“select * from Authors”, mySqlConnection);
Oppure
SqlDataAdapter da = new SqlDataAdapter(); da.SelectCommand.Connection = mySqlConnection; da.SelectCommand.CommandText = “select * from Authors”; DataSet ds = new DataSet();da.Fill(ds, “Authors”);
Ci consente di accedere ad una tabella in modalità connessa,con accesso sequenziale.
Legge solo una riga alla volta.
Costituisce un cursore solo-avanti e in sola lettura ai dati da un db sql server.Da usare se bisogna solo visualizzare i dati(maggiori prestazioni rispetto al DataAdapter.)
Es:
SqlConnection myConnection = new SqlConnection(“”);SqlCommand myCommand = new SqlCommand(“select * from Authors”, myConnection);myConnection.Open();SqlDataReader dr = myCommand.ExecuteReader();//riempimento datagridDataGrid1.DataSource=dr;DataGrid1.DataBind();myConnection.Close();
Rappresenta una relazione tra 2 colonne di 2 tabelle diverse.
GetChildRows e GetParentRow sono 2 metodi del DataRow per ritornare le righe figlie o padri corrispondenti
DataRow[] myRows=dtSaleFil.Select(sFilter);
DataTable dtSaleFiltered = dtSale.Copy();//copio la struttura e dati
dt.Rows.Clear();
foreach (DataRow dr in myRows)
{
dt.ImportRow(dr);
}
for (int i=0;i <= dtRes.Rows.Count - 1;i++)
{
iSum = iSum + Convert.ToInt32(dtRes.Rows[i]["UnitsInStock"]);
}
DataView DV = new DataView(myDataSet.Tables[”Customers”]);OppureDataView dv=new DataView();dv.Table=ds.Tables[0]OppureDataView dv = ds.Tables[0].DefaultView;
dv[i]["protocollo"]
foreach(DataRowView rowView in dv) { rowView.Row}
DV.Sort = “CustomerID”;
// filtro per la colonna nome e cognome
dv.RowFilter = "nome LiKE '%Daniele%' OR cognome = 'bochicchio'"
DV.RowFilter = “CustomerID=’ALFKI’”;dv.RowFilter="";//annulla il filtro precedente //leggere un campo filtratodv[i]["RISPOSTA"].ToString();
//prima ordino sulla colonna nome e poi passo il valore pippoDV.sort=”Nome”;//ritorna l’indice della prima occorrenzaint ret=DV.Find(“pippo”);DV.Tables[0].Rows[ret][“Cognome”].ToString();
//prima ordino sulle colonne nome e poi passo i due valori da ricercareDV.sort=”Nome”;//ritorna l’indice della prima occorrenzaint ret=DV.Find(new object[] {"2","2"});DV.Tables[0].Rows[ret][“Cognome”].ToString();
//Restituisce un array di DataRowViewDataRowView[] foundRows = dv.FindRows (new object[] {"2","2"} );
Dg.DataSource=DV;Dg.DataBind();
Esempio di select con parametro letto da una combo.
String selectCmd = “select * from Authors where state =@State”;SqlConnection myConnection = new SqlConnection(“”);SqlDataAdapter myCommand = new SqlDataAdapter(selectCmd, myConnection);myCommand.SelectCommand.Parameters.Add(new SqlParameter(“@State”, SqlDbType.NVarChar, 2));myCommand.SelectCommand.Parameters[”@State”].Value =MySelect.Value;DataSet ds = new DataSet();myCommand.Fill(ds, “Authors”); MyDataGrid.DataSource=ds.Tables[”Authors”].DefaultView;MyDataGrid.DataBind();
In Italiano associazione di dati.
Mentre il recordset di Ado veniva associato attraverso una modalità ciclica fatta da noi,ora invece la visualizzazione dei dati risulta molto piu comoda.
Il DataBinding inizia nel momento in cui associamo la Fonte Dati al DataControl attraverso la proprietà DataSource richiamando poi il metodo DataBind().
L’associazione avviene attraverso questa istruzione:
<%# Container.DataItem(“nomecolonna”)%>oppure
<%# DataBinder.Eval(Container.DataItem,”nome colonna”%>
Le due istruzioni sono equivalenti ma la seconda utilizza un costrutto che permette di valutare il contenuto del DataItem(che non sia nullo,cast,…)ed e’ utile dove il suo terzo parametro rappresenta la formattazione da applicare.
E’ la scelta migliore piu’ leggera per ripetere un layout.
<asp:Repeater ID="Repeater1" runat="server">
<HeaderTemplate>
<table cellspacing="0" rules="all" border="1" style="border-collapse:collapse;">
<tr>
<th scope="col">
Product Name
</th>
<th scope="col">
Total
</th>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<%#Eval("ProductName")%>
</td>
<td>
<%#Eval("Total")%>
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table></FooterTemplate>
</asp:Repeater>
E’ una lista che permette in piu’ di scegliere quante colonne per riga(RepeatColumns) e il verso di ripetizione(RepeatDirection).
Lanciare IIS,tasto destro,tutte le attività,Riavvia IIS.
Questo metodo di autenticazione consente a qualsiasi utente di accedere al sito Web o Ftp.E’ chiamato anche publico perche’ non richiede nomi utenti o password.
Per questo tipo di accesso bisogna impostare un account(user,password) che verrà utilizzato nel momento in cui facciamo richiesta di risorse specifiche(DB,…)
Questo significa che se proviamo a fare una qualsiasi operazione sul db(con la trusted connection) il db ci autentica con l’account inserito nell’accesso anonimo.
Questo metodo di autenticazione tiene conto dell’utente loggato che fa richiesta di una specifica risorsa.
· Low: è il livello di isolamento più basso. In questo caso l’applicazione girerà nello stesso spazio di memoria di IIS.
· Medium: è il livello intermedio e quello di default. Tutte le applicazioni condividono questo spazio di memoria, ma IIS ne ha uno separato.
· High: è il livello di isolamento più alto, che isola del tutto l’applicazione rispetto alle altre ed allo stesso web server.s
Nel caso in cui un’applicazione ha problemi di stabilità, in genere si utilizza la modalità “High isolation”, che fa sì che eventuali crash dell’applicazione non influenzino le altre, che in genere si trovano in una modalità di isolamento intermedia. Questo isolamento, però, può portare controindicazioni, come una maggior consumo di risorse e l’impossibilità, ad esempio, di utilizzare alcune funzionalità come CDONTS/CDOsys.
Non e’ ereditabile e contiene un costruttore privato.
Un interfaccia è una descrizione dei metodi e delle proprietà esposte in una classe. Essa non definisce un’ implementazione ma si limita a dire cosa fare e non come farlo.E’ possibile separare completamente l’interfaccia di una classe dalla sua implementazione grazie alla parola chiave interface.Pertanto due classi potrebbero implementare in modi diversi la stessa interfaccia(Polimorfismo).
I metodi all’interno dell’interfaccia sono implicitamente pubblici,quindi anche la loro implementazione deve essere pubblica.Una classe non puo’ creare un’implementazione parziale di un’interfaccia,semmai puo’ estenderla con nuovi metodi.
Public interface Ipersona
{
string nome(get; set; )
string cognome (get; set;)
}
Per implementare un interfaccia si utilizza lo stesso metodo dell'ereditarietà,
ovvero si separa la classe dall'interfaccia con (:).
Vediamo un esempio:
Public class persona : Ipersona
{
public string nome()
{
// l'implementazione della proprietà
va scritta qui
}
public string cognome()
{
// l'implementazione della
proprietà va scritta qui
}
}
Programmare utilizzando le interface consente di risparmiare una notevole quantità di tempo.
Il progettista definisce l’interfaccia con tutte le firme dei metodi da utilizzare.
Mentre un programmatore si occupa dell’implementazione della classe che fa uso dell’interfaccia definita,un’altro si puo’ occupare della pagina che chiama i metodi dell’interfaccia.
Si crea cosi’ un parallelismo di scrittura del codice.
Un delegato e’ una classe contenente un riferimento al metodo ovvero un puntatore ad una funzione che viene chiamata quando si genera un evento.
I delegati vengono utilizzati per passare uno o piu’ riferimenti(delegati multicast) a funzioni.
Il delegato (come l’event) ha bisogno di un gestore(delegate handler).

Nell’esempio1 viene istanziata la ClasseA(pagina) e richiamato il metodo Metodo1.
Se pero’ la ClasseB(UserControl) venisse utilizzata all’interno di un’altra pagina(ClasseC)
questo non funzionerebbe perche contiene un riferimento specifico alla ClasseA.
Nell’esempio2,nel page_load,viene passato al delegato il riferimento al metodo1 che poi verra’ richiamato sul button_onclick.
IIMPORTANTE:il metodo e il delegato devono avere la stessa firma.
Con “delegate multicast” si intende la possibilità di richiamare, con una sola chiamata ad un delegate, più funzioni contemporaneamente.

L’evento e’ una sorta di delegato.
Una volta definito l’evento al’interno della classe,per gestirlo lo associamo ad un event handler che verrà eseguito al momento in cui l’evento si verifica.
public event EventHandler ItemClick àevento
public void Item_Click(object sender, System.EventArgs e) àgestore dell’evento
this.ItemClick += new SystemEventHandler(this.Item_Click)
Da inserire nel InitializeComponent()
Click di un pulsante:
this.btnIns.Click += new System.EventHandler(this.btnIns_Click);this.Unload += new System.EventHandler(this.WebForm2_Unload);
oppure voglio richiamare la void myClick sul click del pulsante btnIns:
this.btnIns.Click += new System.EventHandler(myClick);
private void myClick(object sender, System.EventArgs e) //gestore evento
{ //Insert application exit code.}
1. Da mettere nell classe(U.C.)
// DICHIARAZIONE EVENTO
public event EventHandler ItemClick;
//METODO CHE SOLLEVA L’EVENTO(gestore dell’evento)
protected virtual void OnItemClick(EventArgs e)
{
if (ItemClick != null)
{
ItemClick(this, e);
}
}
2. Da mettere nella pagina che deve trappare l’evento
//INSERIRE NEL TAG HTML DELLO U.C.
OnItemClick=”MySub”
public static void Main() {int radius = 5;Console.WriteLine(“The area is {0:0.00}”, CalculateArea(radius));}
public class Math Classe{protected long sAdd1=0; //membro internoprotected long sAdd2=0; //membro interno public long add1 //Proprietà{ get{return sAdd1;} set{sAdd1=value;}}public long add2 //Proprietà{ get{return sAdd2;} set{sAdd2=value;}}public long Somma() //Metodo{ return sAdd1+sAdd2;}}
Math myClass=new Math()MyClass.add1=5;MyClass.add1=8;Long rit=MyClass.Somma();
static double CalculateArea(int r) {
double area;area = r*r*Math.PI;return area; }
public bool GetSQLRoleValidation(
string sDomain,
string sUserName,
ref int iIdRuolo,
ref string sRuoloSql,
ref bool bControllato
);
Login myLogin = new Login();
bool bRc=myLogin.GetSQLRoleValidation(
sDominio, sUserName,
ref iIdRuolo,
ref sRuolo, ref bOk
);
public bool GetSQLRoleValidation(params int[] list)
for (int i = 0 ; i < list.Length; i++)
{ Console.WriteLine(list[i]); }
Bool rit= GetSQLRoleValidation(1,2,3,4…)
Public:sono accessibili da qualunque punto,soprattutto da altre applicazioni che fanno riferimento(istanza)
Friend:sono accessibili da qualunque punto all’interno dello stesso modulo,classe,namespace.
Protected:sono accessibili solo all’interno della classe in cui sono dichiarate o di una classe che eredita da tale classe.
Private:sono accessibili da qualunque punto all’interno dello stesso modulo,classe.
Virtualutilizzato nel metodo della classe base per consentire alla classe derivata di poter ridefinire il metodo(override)
Override utilizzato nel metodo della classe derivata per ridefinire il metodo virtual della classe base
Abstract una classe astratta non puo’ essere istanziata ma solo ereditata.Un metodo abstract e’ un metodo Virtual.(lo user control e ‘ una classe astratta)
Quando una classe serve solo come modello astratto per generare altre sottoclassi si utilizza il modificatore abstract.
Sealed non puo’ essere ereditata,quindi non ha senso usarla come classe base
Final Quando si vuole evitare che una classe possa generare altre sottoclassi si indica il modificatore final.
Internal e' visibile all'interno delle classi del progetto(visibilità fisica)
Un Assembly .NET e’ l’unità minima compilata in codice gestito(il runtime e’ responsabile della gestione dell’esecuzione del codice attraverso l’allocazione di memoria) IL caratterizzatata sempre da un Manifest e da uno o piu’ file(dll,jpg,doc),oggetto del Versioning e della Compatibilità.
Puo’ essere contraddistinto da uno Strong Name(in COM esisteva il Guid)
il quale e’ composto da una serie di informazioni quali il nome,n° versione,culture,public key token(16 cifre).
Un assembly puo’ essere privato o condiviso.Il primo deve essere distribuito nella stessa directory o sottodirectory dell’applicazione,il secondo puo’ essere utilizzato da piu’ applicazioni solamente se installato nella Gac.
Grazie a .Net viene risolto il problema “dll Hell” ovvero la possibilità di eseguire piu’ versioni dello stesso assembly sullo stesso computer senza confilitti.Se nell’applicazione e’ nota la versione dell’assembly da utilizzare,e’ possibile individuare tra piu’ versioni quella corretta,semplicemente analizzando i metadati degli assembly.
Per poter gestire il Versioning di un Assembly è necessario caratterizzarlo da uno strong name che ne definisce l’identità.
Il runtime usa queste informazioni per localizzare il giusto assembly.
Il public key token viene generato dal Tool SN.exe(vedi Tool)
Tutti gli assembly nella GAC devono avere uno strong name.
Se ricompilo un assemby verra’ generato un nuovo numero di versione diverso dal riferimento contenuto nel Main exe(visibile nel Manifest col ILdasm).
Il CLR considererà due diverse versioni dell’assemby incompatibili per il solo fatto del numero di versione diverso.
Per mantenere la compatibilità tra versioni differenti di Assembly agire sul Publisher Policy o direttive di compatibilità nei file di configurazione delle Application Policy e Machine Policy.
Aggiungere nella voce References la dll che si desidera referenziare (Add References).
Includere la clausola using nomedll.
Per invocarla vedi costruttore.
Sono una catalogazione ovvero un contenitore di classi.Classi simili vengono raggruppate in namespace dal nome esplicativo.
namespace Comedata.SchedeRisorse.Certificazioni
Using Comedata.SchedeRisore.Certificazioni
P.S. non e’ necessario utilizzarlo perche’ fa solo in modo di avere a disposizione direttamente la classe.Si potrebbe sempre utilizzare il percorso Nampespace.classe
Vb.Net:usato nel tag Page per collegare(ereditare) la pagina aspx al codebehind(.cs)
C# : si usano i due punti(:) per ereditare una classe da un’ altra.
Una Classe e’ un modello per generare nuovi oggetti di tipo riferimento(vedi struttura)
Il costruttore e’ un metodo con lo stesso nome della classe superiore,che viene invocato ogni qualvolta viene istanziata la classe attraverso la NEW:
public class Square
{
// Constructor:
public Square(double x)
{
this.x = x;
}
}
Square s = new Square(x);
public static void Main(string[] args)
E’ un metodo della classe che viene invocato prima che la classe venga rilasciata o distrutta.
In c# è possibile rilasciare gli oggetti usando l’istruzione “using”.
L’oggetto e’ valido solo nel blocco racchiuso tra parentesi graffe,oltre il quale viene rilasciato.
using (conn = new SqlConnection(strconn))
{
}//in questo punto viene effettuato il dispose di conn
(prima includere il namespace che continene la classe)
Comedata.SchedeRisorse.Certificazioni.clsCertificazioni myCertificazioni=new Comedata.SchedeRisorse.Certificazioni.clsCertificazioni();
public class WebForm1 : System.Web.UI.Page
public class Square //CLASSE BASE
{
public virtual double Area(long a)
{
return a*a;
}
}
class Cube: Square //CLASSE DERIVATA
{
// Calling the Area base method:
public override double Area(long a)
{
return 6*a*a;
}
}
Square s = new Square();
Square c = new Cube();
Console.WriteLine(“Area of Square = {0:F2}”, s.Area(2));
Console.WriteLine(“Area of Cube = {0:F2}”, c.Area(2));
public class clsMath : MathLibrary.Class1
{
public long NewSomma()
{
return 2+3;
}
}
quando istanzio la classe derivata:
clsMath mymath=new clsMath();
mymath.NewSomma();
Nell’intellisense vedo il nuovo metodo
oltre a vedere tutti i metodi della classe base
myCertificazioni.GetCertDip(valore)
Viene utilizzato per conservare un valore in una variabile statica per poter essere riutilizzata da tutte le istanze di una classe (anche in ambiente state-less Web).
Le variabili statiche sono simili alle variabili Application.
Questo valore sara’ accessibile da piu’ istanze di explorer e mantenuto in memoria fino al riavvio di IIS.
public class class1
{
private static int counter;//variabile statica
public class1()
{
}
public static int GetCounter()
{
return ++counter;
}
}
Permette di creare un insieme di classi e sottoclassi:
Line myline = new Line();
myline.Accounts = new Account[1]; // inizializzo la classe line a contenere 1 account
myline.Accounts[0].UserName = “frenzi”;
Public class Account
{
public string UserName
{
get{return this._username;}
set{this._username = value;}
}
}
Public class Line
{
public string Number
{
get{return this._number;}
set{this._number = value;}
}
public Account[] Accounts
{
get{return this._account;}
set{this._account = value;}
}
}
Una Struttura e’ un modello per generare nuovi oggetti di tipo valore(vedi classe).
A differenze della classe non puo’ estendere altre strutture,cioe’ nessun tipo di ereditarietà.
Le strutture, come già detto, sono abbastanza simili alle classi ma sono allocate nello stack e godono di tutti i vantaggi che questa implementazione fornisce. La copia di un oggetto (allocato nello heap) in genere è una operazione non semplicissima e richiede la creazione di un particolare metodo di copia o clonazione, mentre con le strutture l’assegnamento avviene come per tutti i tipi valore. Una struttura viene definita nel seguente modo:
public struct Utente
{
public string Nome;
public string Cognome;
public int ID;
public string Email;
}
Utente Utente1;
Utente Utente2;
Utente1 = new Utente;
Utente1.Nome = “Antonio”;
Utente1.Cognome = “Cangiano”;
Utente1.ID = 1;
Utente1.Email = “antonio@visualcsharp.it”;
Utente2 = Utente1; // effettua la copia dell’Utente1 in Utente2
public enum Giorno
{
Domenica = 0,
Lunedì = 1,
Martedì = 2,
Mercoledì = 3,
Giovedì = 4,
Venerdì = 5,
Sabato = 6
}
se partono da 0 non è necessario specificarlo
Gli indexer servono per utilizzare una classe come se fosse un array.
class MyIndexer{int[] MyArray = new int[100];public int this[int curindex] {get {return MyArray[curindex]; }set {MyArray[curindex] = value; } }} class Test{public static void Main() {MyIndexer MI = new MyIndexer();//Istanzio la classeMI[0]=100; //setting value to an indexerConsole.WriteLine(MI[0]); //accessing value of an indexer.}
}
Sotto Win2003 il percoso relativo ../ viene sostituito da /
Advanced/Show Friedly Http message
Try{If x (= =0) Throw new System.Exception(“x uguale a zero”);}catch (System.Excpetion err){System.Console.Writeline(err.message);}finally{System.Console.Writeline(“esecuzione terminata”);} n.b. ogni codice scritto dopo il finally non verra’ mai eseguito
Throw rilascia l’errore al metodo chiamante.Blocca l’esecuzione di altro codice
public bool ControllaLogin(
string sUserName,
string sPassword,
string sDomain,
ref string mess
)
{
try
{
string sSql = “SP_HELPROLEMEMBER”;
SqlParameter[] myParams= new SqlParameter[0];
recDataSetUtentiConRuoli =
myDBObject.ExecuteSPDataSet(sSql, myParams);
}
catch(SqlException SqlEx)
{
throw SqlEx; rilascia un errore Sql
}
catch(Exception Ex)
{
throw Ex; rilascia un errore generale
}
}
(using System.Data.SqlClient)
private void button4_Click(object sender, System.EventArgs e)
{
try
{
string messaggio=””;
bool bRc=myLogin.ControllaLogin(txtUsername.Text,txtPwd.Text,
txtDominio.Text,ref messaggio);
MessageBox.Show(bRc.ToString() + “ “ + messaggio);
}
catch (SqlException Ex)
{
string ErrorMess = “Errore: “ + Ex.Source + “\n” +
“Numero n# : “ + Ex.Number.ToString() + “\n” +
“Stato: “ + Ex.State.ToString() + “\n” +
“Classe: “ + Ex.Class.ToString() + “\n” +
“Server: “ + Ex.Server + “\n” +
“Messaggio: “ + Ex.Message + “\n” +
“Procedura: “ + Ex.Procedure + “\n” +
“Linea: “ + Ex.LineNumber.ToString() +
“ - Trace Chiamate: “ + Ex.StackTrace.ToString();
MessageBox.Show(this,ErrorMess,”Errore”);
}
catch (Exception Ex)
{
string ErrorMess = “Messaggio: “ + Ex.Message
MessageBox.Show(this,ErrorMess,”Errore”);
}
}
Provoco un errore generico che verrà trappato nel catch(Exception Ex)
if (IdRuolo==5)
{
throw new Exception(“Che caz.. mi hai passato” + IdRuolo);
}
oppure errore di riferimento nullo:
throw new NullReferenceException(“”);
1. NullReferenceException Ex (using System;)
Eccezione causata da Object reference not set to an instance of an object.
2. SqlException Ex (using System.Data.SqlClient;)
Eccezione causata da errori in sql server
3. Exception Ex (using System;))
Eccezione generica
N.B. ormai la pagina e’ andata in errore,quindi non sarà piuì’ possible visuallizare l’errore nel contesto
Della pagina.
Exception objErr = Server.GetLastError().GetBaseException();
string ErrorMess = “Messaggio: “ + objErr.Message;
Response.Write(ErrorMess);
//Se lo metto evito la propagazione nei livelli successivi Server.ClearError();
<customErrors defaultRedirect=”error.htm” mode=”RemoteOnly/On/Off”/>
· On:Non vengono visualizzate le informazioni sugli errori
· Off:Vengono visualizzate tutte le informazioni sugli errori
· RemoteOnly:gli errori restano nascosti quando la pagina e’ richesta da una macchina remota
Restituisce un array di date e time in formato diverso
string[] DataInizio = Convert.ToDateTime(ds.Tables[0].Rows[0]["DATA_INIZIO"].ToString())
.GetDateTimeFormats();
string sDateI= DataInizio [0];//01/12/2004
string sTimeI= DataInizio [86];//08:00
Cosi’ non ho problemi nella visualizzazione delle date,visto che il metodo ToDateTime
accetta in 3 parametri diversi l’anno,mese e giorno,ottenendo una data formattata nel modo che mi aspetto
System.Globalization.GregorianCalendar GreCall = new System.Globalization.GregorianCalendar();
DateTime data=GreCall.ToDateTime(2004,04,7,0,0,0,0);
System.DateTime.Now.ToShortDateString()
System.DateTime.Now | DateTime.Now
System.DateTime.Now.Year.ToString()
DateTime dtNs = System.Convert.ToDateTime(sData).ToString()); myDataNasc.txtData.Value=dtNs.ToShortDateString();
try
{
DateTime dDataOtt; dDataOtt=System.Convert.ToDateTime(dOtt);
}
catch (System.Exception Ex)
{
//inserimento date non valide
lblMsg.Text=”Formato data non valido!”;
return;
}
oppure utilizzare Range Validator impostando Type,MinValue,MaxValue
String.Format(“{0:N2}”,ds.Tables[0].Rows[0][”COSTO”])
String.ToString("F" + precision);//X DECIMALI
(String.Compare(erRuolo.ERType, "CodiceUO", true) == 0)
string.Join("|",array di stringhe);
“d” Short date 18/09/2005
“D” Long date Settembre 18, 2005
“F” Full date & time (long) Settembre 18, 2005 15:00:00 PM
string spippo=”capello”;
spippo=spippo.Insert(3,”p”);
“cappello”
1.Restituisce una stringa risultante dalla concatenazione di due o piu’ stringhe
2.// Using Strings
String s1;
String s2 = “hello”;
s2 += “ world”;
s1 = s2 + “ !!!”;
3.// Using StringBuilder class for performance
StringBuilder s3 = new StringBuilder();
s3.Append(“hello”);
s3.Append(“ world”);
s3.Append(“ !!!”);
Aggiunge caratteri rispettivamente a sinistra e a destra della stringa
sTitle.ToUpper(); CIAO
sTitle.ToLower(); ciao
Elimina un dato numero di caratteri dalla stringa
Remove(start,count)
String sTitle=”elefante”;
sTitle.Remove(3,3) elete
Sostituisce una stringa con un’altra
sSql=sSql.Replace(“:01”, “’” + sCod_Ancap + “’”);
Utilizza SubString
Es: left(sSql,3) = sSqlWhere.Substring(0,3)
Utilizza SubString
Es: mid(sSql,4,len(sSql)-1) = sSqlWhere.Substring(3,sSqlWhere.Length-1)
Serve per ritornare la posizione di una carattere partendo dall’inizio
if (keyName.IndexOf(“btnLente”)>=0)
Serve per ritornare la posizione di una carattere partendo dalla fine
Serve per estrarre caratteri da una stringa partendo dalla fine
sGruppiAD=sGruppiAD.Substring(0,sGruppiAD.Length-1);//tolgo il | finale
string sStr="flavio";
char c= sStr[2]; //97 a
string a= sStr[2].ToString();//a
int b=(int) sStr[2]; //97
Server per controllare se una stringa e’ vuota
if (variabile == String.Empty)
anzicchè if(variabile ==””)
Vede se la variabile pippo inizia o termina con “msg”
If (Pippo.StartsWith(“Msg”))==true)
Vedi array
Il Verbatim(@) permette di usare una stringa letterale(parola per parola)
String pippo=@”c:\inetpub\wwwroot\”
Invece senza il @ si intende usare una stringa regolare,magari usando delle sequenze di escape:
|
\’ |
Apice |
\”” |
Doppio Apice |
|
\\ |
BackSlash |
\0 |
Null |
|
\a |
Beep-Alert |
\b |
BackSpace |
|
\f |
Salto pagina |
\n |
A capo |
|
\r |
Ritorno inizio riga |
\t |
Tabulazione orizzontale |
|
\v |
Tabulazione verticale |
|
|
|
\u |
Seq. Escape Unicode |
\x |
Seq. Escape esadecimali |
System.IO.FileInfo[] myFile=dir.GetFiles("Web.config");
myFile[0].CopyTo (VirtualPath + "\\Web.config",true);
myFile[0].Delete();
Path.GetFileName(postedImage.FileName)
Directory.CreateDirectory(Server.MapPath("Foto\\Foto\\prova"));
if (Directory.Exists(Server.MapPath("Foto\\Foto\\prova"))))
Viene utlizzato per iterare in quelle classi che non permettono di accedere al singolo elemento(stack,..)
System.Collections.IEnumerator myenum =myST.GetEnumerator();
while(myenum.MoveNext())
{
//_BackLog.WriteInformation("BackButton_TracingStack:" + myenum.Current);
}
String[] sParts;
int[] numbers = new int[10]; // numero di elementi
numbers[0] = “a” //valori dell’array
numbers[1] = “b”
string data [] = new string [] { "a", "b", "c", "d", "e" };//valori dell’array
oppure
Array bidimensionale con 36 elementi sul primo indice e 3 sul secondo
Array Lettere=Array.CreateInstance(typeof(String),36,3);
oppure
Array arr=new Array("pippo","pluto","paperino")
numbers[4] = 5;
Lettere.SetValue("A",1,2);
Test=(string)Lettere.GetValue(J,Carattere)
Int a=myArray.GetLowerBound(0);
int b=myArray.GetUpperBound(0);
Restituisce l’indice dell’elemento pippo
Int index=myArray.LastIndexOf(index,”pippo”)
string[] sParts=nodo.Split(new Char[]{’.’});//splitto la stringa in un array
sParts[0];
nodo.split('|')[2].ToString() //prendo il 3 elemento dell'array
Nodo.Split(new string[1] { "&&" }, StringSplitOptions.None)[0]; //separatore Stringa
string sGruppiNew=string.Join(“,”,sParts);
for (int i=0;i<=sParts.Length-1; i++){}
Line.Accounts = new Account[1]; // inizializzo la classe line a contenere 1 account
Line.Accounts[0] = SubAccount;
'inizializza arraylist
Dim ArrayL As New ArrayList()
ArrayL.Add("primo")
ArrayL.Add("secondo")
ArrayL.Add("terzo")
Il metodo cerca all'interno della collezione una corrispondenza per l'oggetto che gli viene passato e ritorna true se presente, false in caso contrario:
Return MyArray.Contains(MyString)
//scrittura
ArrayList alUsers=new ArrayList();
alUsers.Add(new string[2]{“frenzi”,"Inseritore"});
//lettura
for (int i=0;i<=alUsers.Count-1;i++)
{
string userName=((Object[])alUsers[i])[0].ToString();
string ruolo=((Object[])alUsers[i])[1].ToString();
}
L’hash table contiene elementi nella forma codice,descrizione
HashTable area=new HashTable();
area.add(“100”,”pippo”);
area.add(“101”,”pluto”);
area.add(“102”,”paperino”);
area.add(“103”,”minnie”);
foreach (string code in area.Keys)
{
string a=area[code];
}
IDictionaryEnumerator myEnumerator = hsAnno.GetEnumerator();
while ( myEnumerator.MoveNext() )
{
if (sData == myEnumerator.Key.ToString())
return myEnumerator.Value.ToString();
}
myRowArray = dsCustomers.Select(“ContactName like ‘Kelly%’”);
vedi anche DataView
ds.Select("",sortField)
string connessione = GetConnectionString();
SqlConnection conn = new SqlConnection(connessione);
DataSet ds = new DataSet ();
conn.Open();
SqlDataAdapter sda = new SqlDataAdapter(sSql,conn);
sda.Fill(ds);
return(ds);
If rs.eof à if ds.Tables[0].Rows.Count==0
while (int i<DataSetRuoli.Tables[0].Rows.Count)
{
id=System.Convert.ToInt16(recDataSetRuoli.Tables[0].Rows[i][”ID”]);
i++
}
for(int i=0;i<ds.Tables[0].Rows.Count;i++)
{
}
ds.Tables[0].Rows[0][0]
ds.Tables[0].Rows[i][”ID”];
1° pagina:
Session[”pippo”]=ds
2°pagina:
DataSet paperino=(DataSet) Session[”pippo”];
DataGrid1.DataSource=paperino;
DataGrid1.DataBind();
Restituisce il dataset contenente solo le modifiche effettuate
Ds=DsMio.GetChanges();
DataAdapter.Update(ds,Conn)
Salva sul dataset i cambiamenti effettuati.
Ds.AcceptChanges();
Non interrompre il processo di inserimento in caso di errore
SqlDataAdapetr.ContinueOnError
rs.GetString(formatostringa,numero,delimitatore di campo,delimitare di record,stringa nulla)
es:
In questo modo e’ possibile ottenere il contenuto di un database in formato tabella.
rs.GetString(,,”</td><td>”,”</td></tr><tr><td>”,”Campo vuoto”)
Ds.Tables[0].PrimaryKey=DS.Tables[0].Column[1]
DataColumn totalColumn =new DataColumn(“Total”,Type.GetType(“System.Decimal”));
TestKingDetails.Columns.Add(totalColumn;
totalColumn.Expression = “Quantity * UnitPrice”;
Nell’IemDataBound():
e.Item.Cells.RemoveAt(8);
e.Item.Cells.RemoveAt(7);
e.Item.Cells.RemoveAt(6);
N.B.partire sempre dall’ultima
DataRow dr=null;
dr=ds.Tables[0].NewRow();
ds.Tables[0].Rows.InsertAt(dr,3); //in terza posizione
Serve per impostare il root element del file xml associato
Ds.NameSpace=”Pippo”;
E’ un tipo di dataset che conserva lo schema di un tabella attraverso lo Schema Xml
string xmlData = "<XmlDS><table1><col1>Value1</col1></table1><table1><col1>Value2</col1></table1></XmlDS>";
System.IO.StringReader xmlSR = new System.IO.StringReader(xmlData);
myDS.ReadXml(xmlSR, XmlReadMode.IgnoreSchema);//non tiene conto dello schema
ds.ReadXml(“percorso.xml”);
Ds.WriteXml(“Product.xml”,opzioni)
Opzioni:
IgnoreSchema,consente di scrivere il dataset senza lo schema
WriteSchema, consente di scrivere il dataset con lo schema
DiffGram, consente di scrivere il dataset come DiffGram
ds.WriteXmlSchema('c:\TK\StudentInfo.xsd')
struttura
DataSet dsPivotColl1=new DataSet(); dsPivotColl1.Tables.Add();//creo la tabella dsPivotColl1.Tables[0].Columns.Add("CAMPO");//campi dsPivotColl1.Tables[0].Columns.Add("VALORE");
valori
Object[] valori;
valori=new object[2];
valori[0]=”pippo”
valori[1]=”pluto”
dsPivotColl1.Tables[0].Rows.Add(valori); oppure
dsFI.Tables[0].Rows.Add(new string[2]{“pippo”,”pluto”});
SqlTransaction myTrans;
DBObject myDBObject = new DBObject();
SqlConnection SqlServerConn = new SqlConnection();
myDBObject.GetConnectionDB(ref SqlServerConn);
myTrans = SqlServerConn.BeginTransaction(IsolationLevel.ReadCommitted ,”InsNewTipoCorso”);
try
{
bOk = myLog.InsLog(..);
}
catch(SqlException SqlEx)
{
myTrans.Rollback();
throw SqlEx;
}
catch(Exception Ex)
{
myTrans.Rollback();
throw Ex;
}
private void myDataGrid_ItemDataBound(object sender,
DataGridItemEventArgs e)
{
// solo su Item e Alternating Item
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType ==
ListItemType.AlternatingItem) {
// recupero il valore
della terza colonna
string valore = ((TableCell) e.Item.Cells[2]).Text;
if (DateTime.Parse(valore).Year == 1993) {
e.Item.Style[”background-color”] = “yellow”;
}
}
datagrid1.Columns[0].ItemStyle.Width.Pixel(150)
datagrid1.Columns[0].ItemStyle.Width=0;
dgIndAlt.Columns[1].Visible=false;
(oppure in property builder)
N.B. non funziona per autogenerate column
Per autogenerate column impostare nel ItemDataBound
e.Item.Cells[1].Visible=false;
DataGrid1.Columns(0).ItemStyle.HorizontalAlign=HorizontalAlign.Center
E’ una colonna della DataGrid associata ad un campo della Tabella.In questo modo si ha il completo controllo del campo,soprattutto in Edit Mode si puo’ decidere se deve essere editabile o no.(Read Only)
Da mettere nel dgTbGen_ItemCommand()
string codice=e.Item.Cells[2].Text;
Nell’ItemDataBound mettere:
string cella=(string)(DataBinder.Eval(e.Item.DataItem, “COD_STATUS”));
if (cella.Trim() ==”INLAVORAZ”)
{
e.Item.Font.Bold = true;
}
(vedi on_item_created)
Data Formatting Expression = {0:d} formato small date time
Data Formatting Expression = {0:N} formato numerico
Data Formatting Expression = {0:C} formato currency
Data Formatting Expression = {0:dd/MM/yyyy HH:mm} formato italiano
DateTime fieldDate = Convert.ToDateTime(DataBinder.Eval(e.Item.DataItem, "HireDate", "{0:MM/dd/yyyy}")) e.Item.Cells(1).Text = fieldDate
<%# (DataBinder.Eval(Container.DataItem, “note”) & “”) %>
E’ una colonna della DataGrid usata per la gestione della Selezione,Aggiornamento e Cancellazione del record selezionato.
Evidenzia tutto il record del datagrid
<asp:ButtonColumn Text="Seleziona" CommandName="Select"></asp:ButtonColumn>
E’ una colonna della DataGrid in cui e’ possibile aggiungere qualsiasi tipo di controllo come:
combo,checkbox,validator,…. ed associarlo al campo della Tabella.
(eliminare la label)
<ItemTemplate>
<%# DataBinder.Eval(Container, “DataItem.COD_GROUP”)%> -
<%# DataBinder.Eval(Container, “DataItem.DESCGROUP”)%>
</ItemTemplate>
System.Web.UI.WebControls.CheckBox chkPrint=(System.Web.UI.WebControls.CheckBox)dg.Items[i].FindControl(“chkPrint”);
if (chkPrint.Checked==false)
{
sIn = sIn + idMov + „,“;
}
TextBox txtMese=(TextBox)dg.Items[dg.EditItemIndex].FindControl("txtMese);
<ItemTemplate>
<%#DataBinder.Eval(Container.DataItem,"Freight","{0:C}")%>//formatta
i currency
</ItemTemplate>
<%#DataBinder.Eval(Container.DataItem,"ShippedDate","{0:dd-MMM-yyyy}")%//formatta la data
(DataBinder.Eval(Container, “DataItem.CATEGO”).ToString()==”F”)?”PERSONA FISICA”:”PERSONA GIURIDICA”
con else:
(DataBinder.Eval(Container, “DataItem.COD_COLORE”).ToString()==”R”)?”OBBLIGATORIA”:(DataBinder.Eval(Container, “DataItem.COD_COLORE”).ToString()==”G”)?”FACOLTATIVA”:””
Se il valore della colonna COD_STATUS =”INLAVORAZ” applica il bold
DysplayInBold((string) DataBinder.Eval(Container.DataItem, “COD_STATUS”))
public string DysplayInBold(string item)
{
//TRASFORMA IN BOLD L’ITEM
string output=item;
if (item==”INLAVORAZ”)
{
output=”<b>” + item + “</b>”;
}
return output;
}
<ItemTemplate>
<%# ((DateTime)DataBinder.Eval(Container.DataItem,”Date”)).ToShortTimeString()%> -
</ItemTemplate>
Truncate(DataBinder.Eval(Container.DataItem, “COD_STATUS”).ToString())
Nella public function truncate troncare la stringa
Oppure(vb.net)
<asp:TemplateColumn>
<ItemTemplate>
<%# CType(Iff(Len(Container.DataItem("Field")) > 20, Left(Container.DataItem("Field"),
20) & "...", Container.DataItem("Field")), String)%>
</ItemTemplate>
</asp:TemplateColumn>
Da mettere nel dgTbGen_ItemCommand()
System.Web.UI.WebControls.Label lblCatego=(System.Web.UI.WebControls.Label)e.Item.FindControl(“lblCatego”);
Da mettere nel dgTbGen_ItemDataBound()
string codice=(string)(DataBinder.Eval(e.Item.DataItem, “CODICE”))
E’ una colonna della DataGrid usata per la navigazione verso altre pagine.
dg.SetDataBinding(dataset, dataset.Tables[0].TableName)
Serve per impostare una chiave per ogni item(record) della grid.
Grid.DataKeyField=”ID”;
nella scelta del record(Item_command)
string rit=Grid.DataKeys[(int) e.Item.ItemIndex].ToString();
Dim ds as New DataSet
ds.ReadXml(“percorso.xml”);
dg.DataSource = ds.Tables[0].DefaultView;
dg.DataBind();
1)Windows:
DataGrid1.DataSource = ds.Tables[0].DefaultView;
2)Web:
DataGrid.DataSource = dataset.Tables[0];
DataGrid.DataBind();
oppure
MyDataGrid.DataSource=ds;
MyDataGrid.DataMember=”Authors”;
MyDataGrid.DataBind();
Dg.DataSource=DV;Dg.DataBind();
vedi DataView
MyDataGrid.DataSource = dr;
MyDataGrid.DataBind();
for (int i=0;i<= dg.Items.Count -1 ;i++)
{}
dgItem = New DataGridItem(2, 0, ListItemType.Item)
DataGrid1.Controls(0).Controls.AddAt(2 + 2, dgItem)
DataGridItem dgItem=dgMisure.SelectedItem;
protected void Grid_Sort(Object sender,DataGridSortCommandEventArgs e)
{
BindGrid(e.SortExpression);
}
public void BindGrid(string sortfield)
{
SqlDataAdapter myCommand = new SqlDataAdapter(“select * from Authors”, myConnection);
DataSet ds = new DataSet();
myCommand.Fill(ds, “Authors”);
DataView Source = ds.Tables[”Authors”].DefaultView;
Source.Sort = sortfield;
Grid.DataSource=Source;
Grid.DataBind();
}
Si verifica all’aggiunta di ogni singolo item al Data Control.
e.Item.Cells(0).Attributes.Add(“align”, “Left”)
Viene chiamato ogni volta che viene scritto un record nella griglia,ovvero quando viene effettuata l’associazione dei dti su ogni singolo item.
Importante:viene chiamato 2 volte in piu rispetto al numero di record della griglia,per creare l’header e il footer.
switch(e.Item.ItemType)
{
case ListItemType.Header:
case ListItemType.Footer:
break;
case ListItemType.Item : case ListItemType.AlternatingItem:
//codice
break;
}
Si verifica quando un control contenuto in un item richiede l’esecuzione di un comando.
If e.CommandName==”btnAbilita”
Evento che si scatena nel momento in cui clicco sul Button column ”Edit”.
MyDataGrid.EditItemIndex = (int)e.Item.ItemIndex;
BindGrid();
Evento che si scatena nel momento in cui clicco sul Button column ”Cancel”.
MyDataGrid.EditItemIndex = -1;
BindGrid();
Evento che si scatena nel momento in cui clicco sul Button column ”Delete”.
Chiave=e.Item.Cells[2].Text………………BindGrid();
Server
dl.DataSource=dtResults;
dl.DataBind(); Client <HeaderTemplate> Product Name </HeaderTemplate> <ItemTemplate> <%#DataBinder.Eval(Container.DataItem, "ProductName").ToString()%> </ItemTemplate>
listContratti.DataSource=dsTipoCorsiContratti;
listContratti.DataTextField=”Id_Contratto”;
listContratti.DataValueField=”Id_Contratto”;
listContratti.DataBind();
DataTable dtUo = //datatable
foreach (DataRow dr in dtUo.Rows)
{
ListItem myItem = new ListItem(dr["sigla_UO"].ToString,dr["codice_UO"].ToString());
this.lbElencoUO.Items.Add(myItem);
}
//impostazione selezione multipla
lb.SelectionMode=ListSelectionMode.Multiple;
ListBox lbRoles=(ListBox)Page.FindControl("lbRoles");
foreach (ListItem role in lbRoles.Items)
{
if (role.Selected)
{
string sValue=role.Value;
string sText=role.Text;
}
}
cmbRuoloTerzo.SelectedItem !=null
ddlDipendenti.ClearSelection();//IMPORTANTE
if (ddlDipendenti.Items.FindByValue(Resp) != null)
ddlDipendenti.Items.FindByValue(e.Item.Cells[0].Text).Selected = true;
cmbRuoli.SelectedItem.Value
cmbRuoli.SelectedValue.ToString()
textBox1.Text = ((int) Enum.Parse(typeof(Settimana), comboBox1.SelectedValue.ToString(), true)).ToString();
this.comboBox1.DataSource = Enum.GetValues(typeof(Settimana));
dropRuolo.DataSource = ds.Tables[0].DefaultView;
dropRuolo.DisplayMember = “DESCGROUP”;
dropRuolo.ValueMember = “COD_GROUP”;
private void LoadCmbLog()
{
clsLog mylog = new clsLog();
DataSet DSris = mylog.getlog(0);
this.dropLog.DataSource = DSris;
this.dropLog.DataTextField=”DescLog”;
this.dropLog.DataValueField=”Log”;
this.dropLog.DataBind();
this.dropLog.Items.Insert(0,””);
}
1) casting in Bound Column – TextBox
System.Web.UI.WebControls.TextBox txtLog=((System.Web.UI.WebControls.TextBox)dgCertificazioni.Items[e.Item.ItemIndex].Cells[2].Controls[0]);
2)casting Template Column – Combo
System.Web.UI.WebControls.DropDownList cmbTemplateCert=(System.Web.UI.WebControls.DropDownList)dgCertificazion
i.Items[dgCertificazioni.EditItemIndex].FindControl(“cmbTemplateCertif”);
oppure
LinkButton lnkInfoCert = (LinkButton) e.Item.Cells[4].Controls[0];
Lo aggiunge in coda,altrimenti usa insertAt
ListItem myItem=new ListItem();
myItem.Text=”pippo”;
myItem.Value=”1”;
cmb.Items.Add(myItem);
Elimina il 5 elemento
Cmb.Items.RemoveAt(5)
Valido solo per html select
ListItem item=cmbBlocco.Items.FindByValue("5"); item.Attributes.Add("style","color:red");
TreeNode myRoot=new TreeNode();
myRoot.ID=dt.Rows[i]["IDRILEVAZIONE"].ToString();
myRoot.Text=dt.Rows[i]["RILEVAZIONE"].ToString();
Tree.Nodes.Add(myRoot)
TreeNode myRoot2=new TreeNode();
myRoot.Nodes.Add(myRoot2)
TreeNode SelectedNode=Tree.GetNodeFromIndex(“1,0”);
TreeNode SelectedNode=Tree.GetNodeFromIndex(Tree.SelectedNodeIndex);
TreeNode myNode=(TreeNode)myNode.Parent
Esiste la classe “Regex” che permette di usare le regular expression in C#.
Per un riferimento alla stringa da utilizzare vedi: http://www.regexlib.com
//CONTROLLO CHE SIANO SOLO NUMERI
Regex reg=new Regex(@"^\d*$");
if (!reg.IsMatch(e.Item.Cells[0].Text))
Metodo javascript che scorre l’array Page_Validators e richiama la funzione ValidatorValidate
Proprietà della pagina che ritorna true se la validazione e’ completata
Metodo server che una volta invocato provoca la validazione della pagina.
Attraverso questa proprieta’ e’ possibilie sapere,lato server,se la validazione della pagina e’ andata a buon fine o no.
Proprietà di un controllo button che stabilisce se una volta cliccato il pulsante effettuare o meno la validazione della pagina.
Proprietà del validator che indica il controllo a cui la validazione fa riferimento.
Proprietà del validator che stabilisce se la validazione deve essere efettuata sul client o sul server.
Convalida un campo con una costante o con un altro campo.
Es:viene utilizzato nel calendario per controllare che la data inizio non sia superiore alla data fine.
Esegue una convalida personalizzata.
Puo’ appoggiarsi ad una funzione javascript:
function ClientValidate(objSource, objArgs) { objArgs.IsValid =true; }
impostando ClientValidationFunction su ClientValidate,EnableClientScript=true.
Ma anche ad una funzione Server:
seleziona l’evento da properties.
private void cv1_ServerValidate(object source, System.Web.UI.WebControls.ServerValidateEventArgs args)
{codice.... }
Convalida un campo affinchè un valore sia compreso in un intervallo specificato.
Assicura che il valore immesso corrisponda ad un criterio specificato.
Es:
(?!^0*$)(?!^0*\.0*$)^\d{1,2}(\.\d{1,3})?$
anche negativi:
^-?\d{1,2}(\.\d{1,3})?$
numerico postivo o negativo
^-?\d{1,}?$
Assicura che venga immesso un valore nel campo specificato.
Riepiloga gli errori di convalida che si sono verificati.
|
- |
DisplayMode |
Modalità di visualizzazione del Validation Summary (List, BulletList, SingleParagraph) |
|
- |
Header Text |
Intestazione del Validation Summary |
|
- |
ShowSummary |
Attivazione del Validation Summary |
|
- |
ShowMessageBox |
Se impostata a true, consente di visualizzare gli errori del Validation Summary in una finestra di Windows |
|
- |
ForeColor |
Colore dei messaggi visualizzati |
Creare lo user control (es: uc.ascx):
public void WriteParameter(string name,string valore)
{
//scrive il valore
Response.Cookies[”LOOP”][name]=valore;
}
Aggiungere nel CodeBehind della pagina nella quale inserire lo usercontrol :
uc myControl; myControl = (uc)Page.LoadControl(“uc.ascx”); myControl.WriteParameter(“prova”,”stelio”);
protected uc_btnBack myBack;
myBack=(uc_btnBack)Page.LoadControl(“uc_btnBack.ascx”);
string sc=myBack.pippo();
ph1.Controls.Add(myBack);//place holder
<%@ Reference Control=”uc_btnBack.ascx” %>
uc_btnBack myBack=(uc_btnBack)Page.FindControl(“Uc1”);
Perche l’oggetto non esiste in quanto viene creato solo sul click di un pulsante specifico,quindi non riuscirebbe ad assegnargli il viewstate.Invece se sposto il Controls.Add dentro al Page_Load, esegue ogni volta la creazione dell’oggetto riuscendo ad assegnargli il viewstate.
(in EditMode)
System.Web.UI.WebControls.TextBox txtDataScad=(System.Web.UI.WebControls.TextBox)dgCertificazioni.Items[dgCertificazioni.EditItemIndex].Cells[4].Controls[0];
txtDataScad.CssClass=”Campotext”;
System.Web.UI.WebControls.DropDownList cmbTemplateCert=(System.Web.UI.WebControls.DropDownList)dgCertificazioni.Items[dgCertificazioni.EditItemIndex].FindControl(“cmbTemplateCertif”);
cmbTemplateCert.CssClass=”Campotext”;
TreeFunzioni.DefaultStyle= “font: 10px Verdana, Arial”
ComboSkill.CssClass=”Campotext”;
void Application_Error(Object sender, EventArgs E) {
Context.ClearError();Response.Redirect(“errorpage.htm”); }
<Authors>
<Author>
<FirstName>John</FirstName>
<LastName>Doe</LastName>
</Author>
<Author>
<FirstName>Jane</FirstName>
<LastName>Eod</LastName>
</Author>
</Authors>
XmlDocument _doc = new XmlDocument( );
_doc.Load( _strFilename);
XmlNodeList myNodeList = _doc.GetElementsByTagName( "FirstName" );
ForEach(XmlNode myNode in myNodeList)
{
string a=myNode.InnerText;
}
XmlDocument _doc = new XmlDocument( );
_doc.LoadXml( xmlText);
XmlNodeList myNodeList = _doc.GetElementsByTagName( "FirstName" );
ForEach(XmlNode myNode in myNodeList)
{
string a=myNode.InnerText;
}
E’ un file Xml che viene utilizzato per memorizzare le impostazioni di configurazione di un sito.
<appSettings>
<add key=”ConnString” value=”User ID=app_Formazione;password=formazione;Initial Catalog=PROG_test;Data Source=S6” />
</appSettings>
Puo’ essere utilizzato in qualsiasi pagina aspx o in qualsiasi oggetto.
string sStringaConn = ConfigurationSettings.AppSettings[”ConnString”];
n.b. includere System.Configuration.
Attiva – disattiva l’analisi dell’applicazione
Imposta attributi a livelllo di pagina(Buffer,SessionState,ViewState)
Gestione delle sessioni
Indica quale versione del FrameWork utilizzare (solo in app.config)
<configuration><startup><requiredRuntime version=”v1.0.2605” safemode=”true”/></startup>
</configuration>
Visualizza o meno gli errori(Off visualizza tutti gli errori)
<customErrors mode=”RemoteOnly/On/Off”/>
Attiva o no la compilazione delle pagine
<compilation debug=”true”/>
N.B. In produzione togliere il debug
E’ un file Xml che contiene le impostazioni di configurazione del Web Server.
Si trova in:
C:\WINNT\Microsoft.NET\Framework\ version\CONFIG\Machine.config
Response.Redirect(“frmPippo.aspx?Cont=5&Tot=6,false) (Passare parametri con Server.UrlEncode e Server.UrlDecode per evitare valori accentati che bloccherebbero il tutto)
sCont= Request.Params[”Cont”];
Inserisco:
Cache(“miaChiave”) = “mioValore”
Leggo:
valore = Cache(“miaChiave”) oppure valore = Cache.Get(“miaChiave”)
Transfer simile al Redirect con la differenza che puo’ conservare alcune informazioni della pagina di origine da una richiesta all’altra.
Impostando l’argomento preserveForm=true le proprietà QueryString e ViewState restano disponibili nel form di destinazione.
Server.Transfer(“Pagina.aspx”,true);
Response.Redirect(“Pagina.aspx”);
1° pagina:
Session[”pippo”]=ds
2°pagina:
DataSet paperino=(DataSet) Session[”pippo”];
DataGrid1.DataSource=paperino;
DataGrid1.DataBind();
String sGruppiAD=”pippo”;
Response.Cookies[”SchedeRisorse”][”GruppiAD”] = sGruppiAD;
string sGruppi=Request.Cookies[”SchedeRisorse”][”GruppiAD”];
vengono scritti sul filesystem
cookie di sessione vivono fino a quando l'utente non chiude la sua sessione.
Se un utente apre due processi distinti di i.e. verranno creati due cookie di sessione diversi
(Ecco perche quanto faccio la window.open,il processo e' sempre lo stesso)
HttpCookie cookie = new HttpCookie("BackUrl");
HttpCookie cookie = HttpContext.Current.Request.Cookies["BackUrl"];
cookie.Value
HttpContext.Current.Response.Cookies.Add(cookie);
cookie.Expires=DateTime.Now.AddDays(-1);//distruggo il cookie solo se persistente
Viene utilizzato per impostare una variabile che ha vita tra le operazioni di postback di una pagina.
Ha vita soltanto in quella pagina,in pratica e’ un hidden criptata che viene gestita in automatico da .net.
Serve per ripopolare i controlli ad ogni postback
.
ViewState.Add(“Funz”,Funzione.ToString());
ViewState[“Funz”]=Valore;
String sFunz=ViewState[”Funz”]
sFunz=(string)ViewState[“Funz”]
ViewState[”AreaId”]!= null
Per disabilitare il viewstate di un controllo impostare la proprietà EnableViewState=False
Nella prima pagina impostare la seguente proprieta Get.
public string GetCodIntranet
{
get
{
return txtRagSoc.Text;
}
}
chiamare la seconda pagina col Server.Transfer()
Nella seconda pagina impostare:
public RicercaAnagrafica sourcepage;
RicercaAnagrafica sourcepage = (RicercaAnagrafica) Context.Handler;
Label1.Text = sourcepage.GetCodIntranet;
Viene utilizzato per trasferire i dati da una pagina all’altra.
1° pagina:
Context.Items[“Nome”]=txtNome.Text;
Context.Items[“Cognome”]=txtCognome.Text;
Server.Transfer(“pagina2.aspx”);
2°pagina:
txtNome.Text =Context.Items[“Nome”].ToString();
txtCognome.Text= Context.Items[“Cognome”].ToString();
A questo punto le due pagine formeranno un’unica istanza e quindi condivideranno lo stesso contesto di esecuzione.
Se nella 2° pagina avviene un postback mi perdo tutte le variabili Context settate.
Inserisco nella Cache il dataset ds per 3 ore
if (HttpContext.Current.Cache[”Article”] == null)
{
HttpContext.Current.Cache.Insert(“Article”,
ds, null, DateTime.Now.AddHours(3), TimeSpan.Zero);
}
Ritorno il Dataset dalla Cache:
return (DataSet)HttpContext.Current.Cache[”Article”];
L’autenticazione e’ quel processo di identificazione di uno User.Una volta che il soggetto e’ autenticato,il processo determina le risorse a cui puo’ accedere attraverso l’autorizzazione.
Asp.Net implementa 3 tipi di autenticazione:
<authentication mode= “[Windows/Forms/Passport/None]”>
Denominata anche autenticazione tramite cookie,si basa sull’inserimento delle credenziali(user,password) in una form custom,le quali se soddisfatte,permetteranno l’accesso alla pagina(default) default.aspx ,cambiabile nel tag RedirectUrl.
N.B.:se l’utente prova ad entrare in qualsiasi altra pagina senza essersi prima autenticato nella Login verra’ automaticamente reindirizzato a quest’ultima(vedi loginUrl).
// web.config file
<authentication mode= “Forms”>
<forms
name=”.ASPXUSERDEMO”
loginUrl=”login.aspx”
protection=”All”
timeout=”60” />
</authentication>
<authorization>
<deny users=”?” />-àimpedisce Anonymous Access
</authorization>
//LogIn
FormsAuthentication.RedirectFromLoginPage(txtUsername.Text, false);
//LogOut
FormsAuthentication.SignOut()
Viene utilizzata per convalidare le credenziali di un utente su un dominio A.D.
Una volta autenticato, le credenziali vengono cachizzate dal browser a livello di sessione.
(Se si cambia site vengono richieste di nuovo)
<authentication mode=”Windows”/>
L’autenticazione avviene attraverso il riconoscimento dell’utente loggato.
Il nome dell’utente e’ accessibile attraverso User.Identity.Name come in ASP lo era con Auth_User(non funziona per anonymous access)
<identity impersonate=”true/false” />
|
IMPERSONATE |
IIS ANONYMOUS |
WIN AUTHENTICATION |
|
FALSE |
PROCESS ACCOUNT |
PROCESS ACCOUNT |
|
TRUE |
IUSR_SERVER |
AUTH CLIENT |
|
USERNAME |
USERNAME |
USERNAME |
Table 1. IIS anonymous authentication
|
Web.config Settings |
Variable Location |
Resultant Identity |
|
<identity impersonate="true"/> |
HttpContext |
- |
|
<identity impersonate="false"/> |
HttpContext |
- |
|
<identity impersonate="true"/> |
HttpContext |
Name provided by user |
|
<identity impersonate="false"/> |
HttpContext |
Name provided by user |
Table 2. IIS basic authentication
|
Web.config Settings |
Variable Location |
Resultant Identity |
|
<identity impersonate="true"/> |
HttpContext |
Domain\UserName |
|
<identity impersonate="false"/> |
HttpContext |
Domain\UserName |
|
<identity impersonate="true"/> |
HttpContext |
Name provided by user |
|
<identity impersonate="false"/> |
HttpContext |
Name provided by user |
Table 3. IIS digest authentication
|
Web.config Settings |
Variable Location |
Resultant Identity |
|
<identity impersonate="true"/> |
HttpContext |
Domain\UserName |
|
<identity impersonate="false"/> |
HttpContext |
Domain\UserName |
|
<identity impersonate="true"/> |
HttpContext |
Name provided by user |
|
<identity impersonate="false"/> |
HttpContext |
Name provided by user |
Table 4: IIS integrated Windows
|
Web.config Settings |
Variable Location |
Resultant Identity |
|
<identity impersonate="true"/> |
HttpContext |
Domain\UserName |
|
<identity impersonate="false"/> |
HttpContext |
Domain\UserName |
|
<identity impersonate="true"/> |
HttpContext |
Name provided by user |
|
<identity impersonate="false"/> |
HttpContext. WindowsIdentity |
Name provided by user |
Il processo di lavoro sotto (iis 5) viene eseguito con l’account asp.net definito nel process model.
Il processo di lavoro sotto (iis 6) viene eseguito con l’account definito nell’identità di pool.
La rappresentazione e’ importante perche’ determina con quale account mi presento nel richiedere risorse(DB,pagine aspx….)
IMPERSONATE TRUE
identità del contesto <--- utente autenticato
IMPERSONATE FALSE
identità del contesto <--- User dell' Application Pool
N.B.
nelle connessioni integrate viene trasmessa l'identità del contesto.
identità del contesto = WindowsIdentity.GetCurrent()
using System.Threading;
using System.Security.Principal;
Label4.Text=HttpContext.Current.User.Identity.Name;(WebClient autenticato)
Label5.Text=Thread.CurrentPrincipal.Identity.Name;(identità del thread .net)
Label6.Text=WindowsIdentity.GetCurrent().Name;(Identita’ del contesto)
Label9.Text=WindowsIdentity.GetAnonymous().Name;
passsagio di credenziali ad un webservices che richiede un basic authentication
System.Net.NetworkCredential myCre=new System.Net.NetworkCredential();
myCre.UserName="frenzi";
myCre.Password="password.123";
myWs.Credentials = myCre;
passagio delle credenziali ad un webservices dell'utente autenticato
System.Net.CredentialCache myCre=new System.Net.CredentialCache();
myWs=new vmcom01.WSSSiteManager();
myCre.GetCredential(new Uri(myWs.Url),"basic");
myWs.Credentials = myCre;
E’ quel processo utilizzato per assegnare permessi e diritti ad un utente.
1. Esistono due forme di Autorizzazione:
§ ACL NTFS
§ URL
<authorization>
<allow users=”spin\King”>
</authorization>
<authorization>
<deny users=”spin\king”>
<allow users=”*”>
</authorization>
<authorization>
<deny users=”?”>
</authorization>
<location path='/apps/resumeApplication'>
<system.web>
<authorization>
<deny users=“spin\king” />
</authorization>
</system.web>
<PrincipalPermissionAttribute(SecurityAction.Demand, Name := 'JAMES')>
Public Class MyClass…..
Le impostazioni della cultura vengono prese dal pannello di controllo
string pippo=NumberFormatInfo.CurrentInfo.NumberDecimalDigits.ToString();
Thread.CurrentThread.CurrentCulture=new CultureInfo(“de-DE”);
CultureInfo culture = new CultureInfo("it-IT");
DateTime dtInizio = System.Convert.ToDateTime(myDataInzio.getData(),culture);
System.Convert.ToDecimal
System.Convert.ToString
System.Convert.ToDouble
DateTime dtData=System.Convert.ToDateTime
System.Convert.ToInt32 oppure Int32.Parse
Int aint;
Long along=1000;
aint=(int)along; //esplicito
using CrystalDecisions.CrystalReports.Engine;
ReportDocument myRpt = new ReportDocument();
Reports.dsBolleLotti MySchema=new Reports.dsBolleLotti();
//AGGIUNGO I DATI NEL REPORT
DataSet ds=new DataSet() ;
GetDsBolleLotti(ref ds);
string sPath=Server.MapPath(“./Reports/rptBolleLotti.rpt”);
myRpt.Load(sPath);
this.CrystalReportViewer1.ReportSource = myRpt;
MySchema.Merge(ds.Tables[0]);
myRpt.SetDataSource(MySchema);
this.CrystalReportViewer1.DataBind
E’ possibile richiamare un oggetto Com(unmanaged code) da una pagina aspx seguendo una serie di operazioni.
Le informazioni di tipo sono metadati che descrivono il tipo di classe.In Com le informazioni di tipo sono spesso memorizzate in file .tlb oppure incorporate nella dll.
Cio’ che permette di rendere disponibili in Asp.Net le informazioni di tipo relative ad un oggetto Com e’ un meccanismo che prende la libreria di tipo e genera un assembly .net di interoperabilità(interop.dll).Questo assembly contiene solo definizioni di tipo,perche’ il codice rimane nel componente COM originale che esegue il vero compito in fase di runtime.
E’ possibile importare la definizione del tipo in vari modi:
Questo attributo a livello di pagina,si usa quando una pagina fa uso di un componente Com.Viene forzata l’esecuzione in STA.
AddRefeence /Com Tab
Selezionare la dll Com
[DllImport("TestKingFunctions.dll")]
public static extern int CalculateValue(int x);
Sotto Com+ settare la proprietà identity dell’apllicazione che contiene le dll
sull’utente da autorizzare.
E’ importante distruggere l’oggetto,altrimenti rimane appeso
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
#if DEBUG
alert(“Debug”);
#EndIf
Fare l’Attach sul processo:dllHost.exe
Dececcare “Disable Script Debugging” in i.e.
Debug Processes,attach della copia di IExplorer.exe
Running Document=aspx page
Set breakpoint in client side code
Il debug sul server congela tutte le altre richieste.
1.installare “remote component debug” sul server(1° schermata dvd .net)
2.aggiungere il proprio account nel gruppo “Debuggers” sul server e fare logoff sul client dal quale si vuole debuggare
3.Controllare che il servizio machine debug manager sia avviato.
Debug=true su Web.Config
Lanciare il sito sul server remoto.
Dal menu Debug selezionare Processes.
Selezionare il server che si vuole debuggare.
Fare l’Attach sul processo:aspnet_wp.exe
Selezionare CLR come tipo di programma
(Forse attivare “enable remote debugging” sulle properties)
Altrimentio prova a lanciare sul server, DbgCLR.exe posizionato in
C:\Program Files\Microsoft.NET\SDK\v1.1\GuiDebug
apri le pagina che vuoi debuggare.
imposta il breakpoint.
lancia il sito.
Attach del processo aspnet_wp
First we start the service, and then we attach the debugger to it. We must attach to available running processes.
System.Diagnostics.Debug.Write(“pippo”);
Controllare il valore dell’hidden “__EVENTTARGET”
If(Request.Form[“__EVENTTARGET”]==controllo.ClientID)
N.B. i button non utilizzano l’hidden ma implementano l’interfaccia IPostBackEventHandler
1)
this.btnDelete.Attributes.Add("onclick", "return(ViewChecks());");
2)
<script language="JavaScript" type="text/JavaScript">
<!--
function ViewChecks()
{
var risposta=confirm("Sei sicuro di voler modificare i dati?")
if (risposta==true)
{
return true;
}
else
{
return false;
}
}
//-->
</script>
function Post()
{
var pagina=window.open('','pippo','location=no,scrollbars=yes');
document.Form1.target='pippo';
document.getElementById("btnCerca").click();
}
causare il postback lato client passando il nome dell'oggetto
__doPostBack('ddlPrimiCodici','');
registre prima questo script doPostback:
<script type="text/javascript">
<!--
var theForm = document.forms['Form1'];
if (!theForm) {
theForm = document.Form1;
}
function __doPostBack(eventTarget, eventArgument)
{
alert('doPostback');
if (!theForm.onsubmit || (theForm.onsubmit() != false))
{
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
// -->
</script>
E’ lo stumento attraverso cui oggetti che appartengono ad Application Domain (=una evoluzione del concetto di processo) distinti possono comunicare indipendentemente dal fatto che siano in esecuzione sulla stessa macchina o su macchine distinte purche’ omogenee (ossia entrambe col MS .NET Framework).
Rendono i servizi forniti da un sistema (indipendentemente dal fatto che sia esso Linux/Java, Windows/.NET, ...) acessibili attraverso internet da parte di altri sistemi eterogenei (quindi anche di altri sistemi operativi e piattaforme di sviluppo).
Serve per determinare se un oggetto derivi da una particolare classe o interfaccia.
Aspnet_Wp.exe: viene lanciato appena si lancia un’applicazione asp.net
InetInfo.exe: viene lanciato appena si apre IIS
DllHost.exe: viene lanciato appena si apre Component Services (Com+)
Registrare l’assembly .Net con RegAsm
CreateObject (“Namespace.Classe”)
Permette il refresh di una pagina ogni 5 secondi
<META HTTP-EQUIV=”REFRESH” CONTENT=”5”>
System.Web.UI.WebControls.CustomValidator myCuVal=new System.Web.UI.WebControls.CustomValidator();
myCuVal.ClientValidationFunction=”checkAlert”;
myPage.Controls.Add(myCuVal);//lo aggiungo alla pagina
Nella Classe
protected System.Web.UI.WebControls.LinkButton LnkSortCodice;
Nel Page load
LnkSortCodice=new LinkButton();
this.LnkSortCodice.Click += new System.EventHandler(this.LnkSortCodice_Click);
LnkSortCodice.ID="LnkSortCodice";
LnkSortCodice.Text="Codice";
LnkSortCodice.Attributes.Add("onclick","document.getElementById('txtSort').value='protocollo'");
Nel Codice
Controls.Add(LnkSortCodice);
System.Web.UI.WebControls.CustomValidator myCuVal=new System.Web.UI.WebControls.CustomValidator();
System.Web.UI.HtmlControls.HtmlForm myForm=(System.Web.UI.HtmlControls.HtmlForm) myPage.FindControl(“Centro”);
myForm.Controls.Add(myCuVal);
1)
for(int i=0;i<this.Controls.Count;i++)
{ if(typeof(RequiredFieldValidator)==this.Controls[i].GetType())
{ ((RequiredFieldValidator)this.Controls[i]).Enabled=false;
}
}
2)
foreach (System.Web.UI.Control myControl in ctrl.Controls)
{
string nome = myControl.ClientID;
}
n.b. il ciclo trova prima solo I controlli principali,quali il form.
System.Web.UI.Control c;
string nome = c.ClientID;
string tipo = c.GetType().ToString();
Impostare:
chk1.Attributes.Add(“value”,”-1”)
Leggere:
string a=chk1.Attributes[”value”];
Il motore di parsing permette di convertire stringhe di codice in controlli.
Basta utilizzare la funzione ParseControl che restituisce un riferimento al controllo.
private DropDownList list;
void Page_Init(object s, EventArgs
e)
{
// ....
operazioni per avere il codice ASP.NET
string codeToParse = "Lista <asp:DropDownList runat=\"server\" id=\"list\"/>";
//
Parserizzo i controlli
Control
c = this.ParseControl(codeToParse);
// Lo
aggiungo alla form
form.Controls.Add(c);
//
Recupero il riferimento alla DropDownList
list =
(DropDownList)c.FindControl("list");
}
void Page_Load(object s,
EventArgs e)
{
list.Items.Add("item 1");
}
|
Web Form Events |
|
|
Event handler name |
Occurs when |
|
Page_Init |
The server controls are loaded and initialized from the Web form’ s view state. This is the first step in a Web form’ s life cycle. |
|
Page_Load |
The server controls are loaded on the Page object. View state information is available at this point, so this is where you put code to change control settings or display text on the page. |
|
Page_PreRender |
The application is about to render the Page object. |
|
Page_Unload |
The page is unloaded from memory. |
|
Page_Error |
An unhandled exception occurs. |
|
Page_AbortTransaction |
A transaction is aborted. |
|
Page_CommitTransaction |
A transaction is accepted. |
|
Page_DataBinding |
A server control on the page binds to a data source. |
|
Page_Disposed |
The Page object is released from memory. This is the last event in the life of a Page object. |
AnaColl_Test myForm=new AnaColl_Test();
myForm.Show();
Vedi Global.asax
Random rnd=new Random();
Short num1=Convert.ToInt16(rnd.Next(35000));
Funziona sia in modalità Debug/Release
<%@ Page Trace=”true” %> sulla pagina
oppure
<trace enabled=”true” pageOutput=”true”/> nel WebConfig
Trace.Listeners.Add( new TextWriterTraceListener( “N:\\ankhlog.txt” ) )¨;
Break;
Return;
Private void txtPass_Validiting(object sender,System.ComponentModel.CancelEventArgs e)
{
If (!ValidPassword())
e.Cancel=true;
}
myRpt = new FormazioneDipendenti.Reports.rptAnalisiCorsi()
(ds.Tables[0].Rows[0][”DATA_CORSO”]!=System.DBNull.Value)
If (obj !=null)
Trasformare l’oggetto client con runat=server e dotarlo di un id.
Fare il cast nel tipo di quell’oggetto.
Fare il FindControl dell’id dell’oggetto.
uc_btnBack myObj=(uc_btnBack)Page.FindControl(“Uc1”);
(funziona solo se non e’ presente un controllo validator,perche’ aggiunge un evento onclick personalizzato al validatorà risolto nel fw 1.1)
this.btnCancella.Attributes.Add(“onclick”, “return confirm(‘Confermi la cancellazione?’);”);
Prima di registrare il codice javascript, controllare che non sia stato gia’ scritto
if(!Page.IsClientScriptBlockRegistered(“nome Script”))
1. utilizzare il metodo Page.RegisterClientScriptBlock, per registrare un blocco di codice JavaScript contenente una funzione da richiamare ad un determinato evento client;
2. utilizzare il metodo Page.RegisterStartupScript, per mandare al browser del codice JavaScript da eseguire immediatamente al caricamento della Web Form o sul PostBack del client.
3. utilizzare il metodo Page.RegisterHiddenField per inserire nel form un hidden field impostato su un valore
4. utilizzare il metodo Page.RegisterOnSubmitStatement per inserire codice da eseguire sul submit del form.
es 4)
Page.RegisterOnSubmitStatement(“submit”,”alert(‘submit’)”);
es 3)
Page.RegisterHiddenField(“hdnOpen”,”pippi”);
es 2)
StringBuilder strBuilder = new StringBuilder();
strBuilder.Append(“<script language=’javascript’>”);
strBuilder.Append(“document.getElementById(‘txtCodCorso’).focus()”);
strBuilder.Append(“</script>”);
RegisterStartupScript(“SetFocusSuCampo”, strBuilder.ToString());
Inserire using System.Text;
StringBuilder strBuilder = new StringBuilder(); strBuilder.Append(“<script language=’javascript’>”);
string sScript = “parent.window.open(‘” + sUrl + “’,”,’location=no,scrollbars=yes,menubars=yes,toolbars=no,resizable=yes,left=0,top=0,width=800,height=600’)”;
strBuilder.Append(sScript);
strBuilder.Append(“</script>”);
RegisterStartupScript(“OpenNewReport”, strBuilder.ToString());
N.B. parte in automatico,senza essere richiamato in alcun modo
<input type=”text” name=”txt1” value=<%=sValore%> >
public string sValore; private void Page_Load(object sender, System.EventArgs e)
{
sValore=”pippo”;
Page.DataBind();
}
oppure riferimento ad una funzione public
value=”<%=GetString()%>”
Response.Write("<script>alert(\"No file selected for upload\\nPlease click browse and select the file you wish to upload\");</script>");
Digitare >immed per passare alla modalità immediata myVar
1. Digitare >cmd per passare alla modalità comando
?myVar
Faccio riferimento alla virtuale directory del sito(c:\intetpub\wwwroot\sito)
string sPathXslt=Server.MapPath(“./template.xml”);
In questo modo faccio riferimento a c:\intetpub\wwwroot\sito\template.xml
Obj=null;(in C# ci pensa la GAC)
Migliora la navigabilità nelle operazioni di PostBack.
Da impostare come proprietà nella pagina.
1)Mantiene il focus sul controllo
2)Mantiene lo scroll della pagina
3)Non mette nella History le pagine generate nel PostBack
4)Non si vede l’effetto flash delle pagine
System.Drawing.Color.Red
Windows Form:
Cursor.Current = Cursors.WaitCursor;
WebForm:
btnCalcola.Attributes.Add("OnClick","document.body.style.cursor='wait';");
Sub BtnUp_Click(sender As Object, e
As EventArgs)
inputFile.PostedFile.SaveAs( Server.MapPath(inputNome.Value) )
Results.InnerHTML = "FileUploadato su " & inputNome.Value &
"</b>!"
End Sub
<form enctype="multipart/form-data" RUNAT="server">
<DIV id=Results RUNAT="server"></DIV>
Uploada
questo file: <input
id="inputFile" type=file RUNAT="server"><BR>
Nome: <input id="inputNome" type="text" RUNAT="server"><BR>
<input type=button id="BtnUp" value="Upload!"
OnServerClick="BtnUp_Click" RUNAT="server">
</form>
Autorizzare l’utente corrente a scrivere nella virtual directory del server.
Fare prima il Rebuild della solution
Selezionare il progetto Web.
Cliccare su Copy Project.
Selezionare la virtual directory (es :http://softlab4-2k/FormazioneDipendenti/)
Web Access Method: FrontPage(utilizza il protocollo http,richiede f.p server ext.)
Copy:
All Project Files(copia anche i file cs)
Only files needed to run this application(aspx,dll)
N.B. Richiede le estensioni di FrontPage.
E’ un comando Dos che permette di deployare un’applicazione asp.net da una locazione ad un’altra.
Il copy project richiede l’installazione di FrontPage server extension sul server remoto.
Xcopy permette di copiare anche solo i file piu recenti.
xcopy source [destination] /D:m-d-y
Permette di eseguire delle operazioni durante il setup(eseguire script sql o precompilare con ngen l’applicazione)
blocca l'installazione se una determinata condizione non viene soddisfatta.
1. Aggiungere alla solution un progetto di tipo Cab Project
2. Al progetto Cab fare "Add Project Output"
A. Selezionare il progetto da deployare
B. Selezionare "Primary Output"(contiene la dll principale)
C. Selezionare "Content Files" (se si vuole deployare tutti quei file che hanno come properties build action=content)
3. Compilare il progetto Cab
4. Viene creato il “.cab”
1. Utilizzare StateServer come un servizio esterno ad aspnet_wp sullo stesso o altro server.
2. Utilizzare SqlServer come StateServer
Inserire nel machine.config <sessionstate cookieless=true>
L’identificativo di sessione viene passato direttamente nell’url.
Per utilizzare un’analogia con il mondo reale,l’oggetto e’ la macchina, la classe è il progetto che ha dato vita alla macchina.I progetti possono essere utilizzati per realizzare un numero qualsiasi di macchine (1 classe à N oggetti(istanze)).
Se devo dar vita ad una macchina rossa ,utlizzero’ sempre lo stesso progetto ma passero’ l’informazione “rosso” al costruttore della classe.
1. Classe (concetto valido in fase di sviluppo)
E’ una parte di programma che contiene il codice necessario alla definizione di proprietà,metodi ed eventi di oggetti che saranno creati in fase di esecuzione.
2. Oggetto(concetto valido in fase di esecuzione)
E’ un’area di memoria creata in fase di esecuzione .
L’utente non utilizzerà mai una classe,ma utilizzerà gli oggetti creati dalle classi.
Il programmatore,viceversa,scriverà il codice per definire una classe.
Creare un’istanza di una classe,significa creare in memoria una copia dei dati definiti da quella classe e assegnarla alla variabile oggetto di riferimento.
clsCertificazioni myCertificazioni;
myCertificazioni = new clsCertificazioni();
Una classe puo’ ereditare una classe base e implementare una o piu’ interfacce.
Vedi definizione.
E’ la capacità di una classe(classe derivata o sottoclasse) di ereditare o ottenere funzionalità da un’altra classe(classe base o superclasse).In questo modo la classe derivata eredita automaticamente le proprietà ed i metodi della classe.Alla base di tutto c’e’ il concetto di gerarchia.
Per esempio,una mela Delizia fa parte della classe mela che a sua volta e’ parte della classe frutto.Cio’ significa che la classe frutto possiede delle qualità(succoso,dolce,..) e la classe derivata mela definisce le qualità specifiche di una mela(cresce sugli alberi,non tropicale,..)Una mela Delizia eredita a sua volta tutte le qualità delle classi precedenti e definisce soltanto quelle qualità che la rendono unica.
L’ereditarietà multipla non e’ supportata,a differenza di C++.
I vantaggi sono:
1. Riusabilità
Una classe puo’ essere costruita in modo indipendente da uno specifico contesto.
Tutte le caratteristiche generali sono scritte una sola volta.
2. Portabilità
Cambiando il contesto,e’ sufficiente cambiare la classe base.
3. Riduzione del codice
Non e’ necessario riscrivere tutti i metodi e le proprietà della classe base ma soltanto quelli della classe derivata.
l’ereditarietà permette l’estensione della sua implementazione.
Permette di definire una componente come composizione di componenti più elementari delegando il comportamento di alcune sue operazioni alle componenti incapsulate. Ad esempio, il modello a oggetti definito da Microsoft COM (Component Object Model) utilizza l’aggregazione come strategia di riuso evitando completamente l’ereditarietà ritenuta da Microsoft “fragile” e fonte di problemi.
E’ la caratteristica per cui classi diverse implementano lo stesso metodo ma con comportamento diverso.(vedi interfaccia)
Esempio:Le classi Fattura e Cliente hanno il metodo Salva,ma naturalmente esso sara’ implementato in maniera differente.
Il polimorfismo permette l’estensione del tipo di un’interfaccia.
I dati sono proprietari dell’oggetto e sono accessbili e modificabili solo attraverso i suoi metodi.
I vantaggi sono:
1. L’elaborazione del dato avviene in un unco punto.
2. Indipendenza dalle modifiche,perche’ un oggetto puo cambiare senza impatti sugli altri oggetti.
3. Manutenzione
Per un componente e’ importante sapere cosa fa (interfaccia) e non come lo fa(implementazione)
Consiste nella possibilità di definire piu’ versioni di uno stesso metodo all’interno della stessa classe,utilizzando lo stesso nome ma un numero e/o un tipo diverso di argomenti.
Possibilità di modificare il funzionamento di un metodo di una classe base ereditata.
Es:
public override string ToString()
{
return “Name = “ + Name + “, Age = “ + Age + “ flavio”;
}
Ho modificato il comportamento del metodo ToString();
N.B il metodo deve avere lo stesso nome e stessi parametri del metodo originale
Il processo e’ un programma in fase di esecuzione.Il multitasking basato sui processi e’ la funzionalità che permette al computer di eseguire due o piu’ programmi contemporaneamente.
Includere System.Diagnostic
Process msiProcess = new Process();
msiProcess.StartInfo.FileName = "msiexec.exe";
string sMsi="\"" + rblMsi.SelectedItem.Value + "\"";
msiProcess.StartInfo.Arguments = Arguments + sMsi;
msiProcess.Start();
msiProcess.WaitForExit();
msiProcess.Close();
Unità di base di esecuzione codice.Possibilità di far girare pezzi di codice in parallelo(MultiThreading).
Un processo puo’ avere piu thread.
C# suppporta il multithreading,Vb 6 no.
Lanciare in parallello piu pezzi di codice all’interno dello stesso processo.
E’ il processo in base al quale una pagina Web Form invia una richiesta post http a se stessa come risposta ad un’azione dell’utente.
E’ il processo mediante il quale gli oggetti e i valori vengono convertiti in un formato permanente(file).
Su .Net sono supportati due tipi di serializzazione:binaria e xml.
Per rendere serializzabili gli oggetti in tipo binario,occorre contrassegnare la classe con l’attributo “Serializable”.
Per rendere serializzabili gli oggetti in tipo xml,occorre utilizzare la classe XmlSerializer.
Per leggere lo stato degli oggetti o dei valori che vengo resi permanenti mediante serializzazione,occorre la deserializzazione.
Reflection indica la possibilità di ottenere le informazioni relative ai tipi contenuti in un assembly a run-time. Infatti tramite il namespace System.Reflection il .NET Framework fornisce una serie di API per analizzare assemblies e oggetti, consentendo addirittura di invocare direttamente i metodi di una classe, o di accedere alle sue proprietà.
La Reflection si rivela pertanto un meccanismo assai potente e utile in molte circostanze, per esempio, per creare assemblies dinamicamente in memoria o, appunto, invocare un metodo di un tipo contenuto in un assembly.
Per utilizzare la Reflection la prima cosa da fare è includere il relativo namespace, che è System.Reflection: using System.Reflection;
Assembly asm = Assembly.LoadFrom("myAssembly.dll");
Tramite Assembly.GetType(String) è possibile conoscere non poche informazioni su un tipo: Name, Namespace, IsClass, IsInterface, IsAbstract, IsCOMObject, IsSealed, IsPublic, ecc.
Type
typesArray[] = asm.GetTypes();
Type
thisType = asm.GetType("myClass");
MethodInfo[]
methodsArray = thisType.GetMethods();
MethodInfo
thisMethod = thisType.GetMethod("myMethod");
Per invocare a run-time un metodo tramite Reflection occorre necessariamente creare un'istanza del tipo a cui è associato il metodo stesso. Per fare questo si ricorre dapprima alla classe System.Activator ed, in particolare, al metodo statico CreateInstance(Type). Quindi viene chiamato il metodo Invoke(Object, Object[]) dell'istanza di classe MethodInfo ottenuta tramite le istruzioni citate in precedenza.
Assembly
asm = Assembly.LoadFrom("myAssembly.dll");
Type
thisType = asm.GetType("myClass");
MethodInfo
thisMethod = thisType.GetMethod("myMethod");
Object
objInstance = Activator.CreateInstance(thisType);
Object[]
paramsArray = new Object[1];
paramsArray[0]
= "myParam";
thisMethod.Invoke(objInstance,
paramsArray);
Se il metodo ritorna un valore, l'ultima riga di codice solitamente diventa:
Object returnValue = thisMethod.Invoke(objInstance, BindingFlags.DefaultBinding, null, paramsArray, null);
Stablisce che la stessa chiave sia in grado di cifrare e decifrare un file.
Permette di cifrare un file con una chiave e decifrarlo con un’altra.
Nel meccanismo vengono impiegate due chiavi differenti(da cui il termine asimmetrico).
E’ un tipo di crittografia a chiave asimmetrica,che assicura:
Il mittente cifra il file una prima volta con la chiave pubblica del destinatario(che ottiene da un Certification Authority) ed una seconda con la sua chiave privata.
Quando il destinatario riceve il messaggio,lo decifra con la chiave pubblica del mittente(reperibile dal CA) e poi con la sua chiave privata.
Sono stati ottenuti entrambi i 2 obiettivi.Solo il destinatario puo’ decifrare il messaggio visto che e’ il solo in possesso della chiave privata,in piu’ e’ sicuro che il messaggio provenga dal mittente giusto,altrimenti la chiave pubblica del mittente utilizzata per decifrarlo non avrebbe funzionato.
Consiste nel calcolare un digest(il risultato di un’operazione matematica della quale
è impossibile fare l’operazione inversa)su un documento,criptarlo mediante un algoritmo
a chiave asimmetrica e unire il documento con la rappresentazione della firma.
Chi vuole validare la firma andrà a calcolare a sua volta il digest del documento
originale “presunto” e lo confronterà con il digest decriptato con la chiave pubblica del mittente.
Se combaciano il documento e’ integro.
La conversione esplicita viene invocata via “Cast”.Omettendo il Cast,il compilatore ritornerebbe un errore di compilazione.Previene il compilatore da una conversione forzata.
int i;
SomeType x = (SomeType)i;
Viene invocata esplicitamente senza usare il “Cast”.Utilizzare conversione implicite puo’ portare a codice ‘confuso’.
int i = x;
SomeType x;
public enum FileMode
{
Append,
Create,
CreateNew,
Open,
OpenOrCreate,
Truncate
}
FileMode.Append
public const string RicercaOfferta=”2”;
And = &&
Or= ||
Per uscire da un cliclo usare Break;
Continue;
while (n < 100)
n++;
do
{
Test=”5”;
J=J+1;
}
while(Temp!=Test);
for (int i=1;i<=10;i++)
{
}
foreach (int i in iArray)
{
}
If (i = = 5)
{
total=1;
}
else
{
totale=2;
}
(DataBinder.Eval(Container, “DataItem.COD_COLORE”).ToString()==”R”)?”OBBLIGATORIA”:(DataBinder.Eval(Container, “DataItem.COD_COLORE”).ToString()==”G”)?”FACOLTATIVA”:””
If (condizione)
goto label;
label:
operazioni
// single line
/* multiline */
Int x;
Int x=10;
Il default viene raggiunto se nessun case e’ soddisfatto
switch(n)
{
case 0:
total=0;
break; obbligatorio
default:
total=1;
break;
}
int intForA = (int) 'A';
char charFor65 = (char)65;
3%2=1
Random rnd=new Random();
rnd.Next(11);//da 0 a 10
rnd.Next(1,91);//da 1 a 90
document.getElementById('<%=lblOff.ClientID%>').value
<script language=Javascript> window.open(“pagina.htm”,””,”fullscreen,scrollbars”)
</script>
n.b.Funziona solo con i.e.
<!--[if IE]>
Qui il codice per MsIE
<![endif]-->
Cosi’ evita che l’utente provi ad inserire piu’ volte lo stesso valore
<body onbeforeunload="javascrip:document.getElementById('btnInsert').disabled = true;">
Fa scadere l’history della pagina
<%@ OutputCache Duration = "1" Location = "server" VaryByParam = "none"%>
Response.CacheControl = "no-cache";
Response.AddHeader("Pragma", "No-Cache");
Response.Expires = -1;
Response.Cache.SetNoServerCaching();
<a href=javascript:location.replace(“nuova-pagina.htm”)>Collegamento</a>
oppure
<META http-equiv=”REFRESH” content=”0; url=pagina.htm”>
window.opener.location.reload(true);
document.getElementById('sc').options[document.getElementById('sc').selectedIndex].text (.value)
/n
//apro la modale passabdo byRef il document
window.showModalDialog("Officine.aspx" + value, document,dialogWidth: 430px;dialogHeight: 370px);
//nel modale leggo l'oggetto document
window.dialogArguments.getElementById('txtVett').value = '5';
//scrivere un dato nell'opener(solo se aperto con window.open)
window.opener.document.getElementById('txtVett').value = document.getElementById('lstModelli')[document.getElementById('lstModelli').selectedIndex].text;