Manuale C# - ASP.NET

FrameWork .Net

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.

Requisiti

Obbligatorio Mdac 2.6,consigliato 2.7.

Sdk-Runtime

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)

Clr

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,…

Gac

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)

 

Add assembly to GAC

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.

Cts

Garbage Collection

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.

Msil

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.

Manifest

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.

Libreria di classi .NET

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

Controlli Html-Server

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

Tool

 

ILAsm

attraverso ilasm e' possibile ricompilare l'assembly partendo dal codice "il"

modificato con ilDasm (c:\windows\Microsoft.Net\Framework\v1.0.3705)

ILDasm

attraverso ildasm e' possibile generare il codice "il" di un assembly,editarlo

col notepad,modificarlo. (c:\programmi\VisualStudio.Net\FrameWork SDK\Bin)

FusLogView

visualizzatore log assembly…..

(c:\programmi\VisualStudio.Net\FrameWork SDK\Bin)

SN(secure name)

(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

AL(assembly linker)

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

GacUtil

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

Regsvcs

(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+.

Reflector

Simile al ILAsm ma parte dal IL per interpretare in codice C# o VB.net.

RegAsm

Serve per registrare (nel registro) un componente net per essere utilizzato con tecnologia COM.

PermView

Serve per determinare i permessi che un assembly richiede per essere eseguito

Ngen

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

 

TlbImp

Permette di importare da un oggetto Com la definizione dei tipi in un oggetto .net

tlbimp C:\myDll.dll /out:C:\InterOp.dll

 

Csc

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

 

xsd

(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.

SignCode

Serve per firmare un assembly per evitare che venga alterato da altri programmatori

 

Cambiare il FrameWork per le pagine aspx

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.

Command Prompt .Net

Tool simile al prompt dei comandi utilizzato in sostituzione dell’ambiente Visual Studio.

Compilazione C#

Compila  una classe c#(.cs) in un eseguibile o dll

Csc path/classe.cs

Esecuzione

Eseguibile.exe

Asp.Net vs Asp

Differenze tra Asp e Asp.Net

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

Ado.Net

Architettura

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.

Connection

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”);

Dispose

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.

Pooling

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

SqlConnection

puo’ essere utilizzato solo con Sql server 7 o successive

Command

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:

ExecuteNonQuery()

Viene utilizzato per Insert,Update,delete(Es. 1)

Restituisce un intero che indica il numero di righe affette

ExecuteScalar()

Viene utilizzato nel caso in cui il comando ritorna esclusivamente un unico valore(Es. 2)

ExecuteReader()

 

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()

DataSet

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”);

 

DataAdapter

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”);

 

DataReader

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 datagrid
DataGrid1.DataSource=dr;
DataGrid1.DataBind();
myConnection.Close();
 

DataRelation

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
 

DataTable

Select

DataRow[] myRows=dtSaleFil.Select(sFilter);

 

Copy

DataTable dtSaleFiltered = dtSale.Copy();//copio la struttura e dati

 

ImportRow

dt.Rows.Clear();

foreach (DataRow dr in myRows)

{

dt.ImportRow(dr);

}

Ciclare

 

            for (int i=0;i <= dtRes.Rows.Count - 1;i++)

            {

                iSum = iSum + Convert.ToInt32(dtRes.Rows[i]["UnitsInStock"]);

            }

DataView

Creare un DataView

DataView DV = new DataView(myDataSet.Tables[”Customers”]);
Oppure
DataView dv=new DataView();
dv.Table=ds.Tables[0]
Oppure
DataView dv = ds.Tables[0].DefaultView;
 

Leggere un campo

dv[i]["protocollo"]
 

Ciclare su un dataview

foreach(DataRowView rowView in dv) 
{ 
        rowView.Row
}
 

Ordinare dati

DV.Sort = “CustomerID”;
 

Filtrare dati

// 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 filtrato
dv[i]["RISPOSTA"].ToString();
 

Ricercare un dato su una colonna

//prima ordino sulla colonna nome e poi passo il valore pippo
DV.sort=”Nome”;
//ritorna l’indice della prima occorrenza
int ret=DV.Find(“pippo”);
DV.Tables[0].Rows[ret][“Cognome”].ToString();
 

Ricercare un dato su piu colonne

//prima ordino sulle colonne nome e poi passo i due valori da ricercare
DV.sort=”Nome”;
//ritorna l’indice della prima occorrenza
int ret=DV.Find(new object[] {"2","2"});
DV.Tables[0].Rows[ret][“Cognome”].ToString();
 

Ricercare piu’ dati su piu colonne

//Restituisce un array di DataRowView
DataRowView[] foundRows = dv.FindRows (new object[] {"2","2"} );
 

Bindare dati al DataGrid

Dg.DataSource=DV;
Dg.DataBind();

Select parametrizzate

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();
 

DataBinding

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.

 

Repeater

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>

DataList

E’ una lista che permette in piu’ di scegliere quante colonne per riga(RepeatColumns) e il verso di ripetizione(RepeatDirection).

 

IIS

Restart servizi internet

Lanciare IIS,tasto destro,tutte le attività,Riavvia IIS.

Accesso Anonimo(Pubblico)

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.

Autenticazione integrata di Windows

Questo metodo di autenticazione tiene conto dell’utente loggato che fa richiesta di una specifica risorsa.

Application Protection

·         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.

Object Oriented

Classe statica

Non e’ ereditabile e contiene un costruttore privato.

Interfaccia

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

Vantaggi nella programmazione

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.

 

Delegati

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.

Delegati MultiCast

Con “delegate multicast” si intende la possibilità di richiamare, con una sola chiamata ad un delegate, più funzioni contemporaneamente.

 

 

 

Eventi

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)

Esempio Evento personalizzato

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.}

Raising Event

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”

 

Procedura

public static void Main() 
   {
int radius = 5;
Console.WriteLine(“The area is {0:0.00}”, CalculateArea(radius));
   }
 

Proprietà

Esempio Proprietà

public class Math Classe
{
protected long sAdd1=0; //membro interno
protected 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;
}
}

 

Impostazione Proprietà

Math myClass=new Math()
MyClass.add1=5;
MyClass.add1=8;
Long rit=MyClass.Somma();
 

Funzione

Esempio Funzione

static double CalculateArea(int r) 
   {
double area;
area = r*r*Math.PI;
return area;
   }

Esempio Funzione con parametri Input Output

public bool GetSQLRoleValidation(

string sDomain,

string sUserName,

ref int iIdRuolo,

ref string sRuoloSql, 

ref bool bControllato

                                   );

 

Chiamata a funzione con parametri Input Output

Login myLogin = new Login();

bool bRc=myLogin.GetSQLRoleValidation(

                 sDominio,                                     sUserName,

                 ref iIdRuolo,

                 ref sRuolo,                                    ref bOk

                                   );

 

Esempio Funzione con parametri illimitati(Params)

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…)

 

Accessibilità delle variabili

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)

Assembly

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).

Privato-Condiviso

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.

Versioning

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.

Compatibilità

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.

Istanziare una dll

Aggiungere nella voce References la dll che si desidera referenziare (Add References).

Includere la clausola using nomedll.

Per invocarla vedi costruttore.

 

NameSpace

Namespace

Sono una catalogazione ovvero un contenitore di classi.Classi simili vengono raggruppate in namespace dal nome esplicativo.

namespace Comedata.SchedeRisorse.Certificazioni

Includere un namespace di una dll referenziata

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

Inherits (Inherits= NameSpace.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.

Classe

Una Classe e’ un modello per generare nuovi oggetti di tipo riferimento(vedi struttura)

Costruttore

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;

            }

                        }

 

 

Istanziare un costruttore(classe)con parametro

Square s = new Square(x);

Parametri al Main

public static void Main(string[] args)

Distruttore

E’ un metodo della classe che viene invocato prima che la classe venga rilasciata o distrutta.

Dispose automatico

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

Istanziare una classe di una dll referenziata

(prima includere il namespace che continene la classe)

Comedata.SchedeRisorse.Certificazioni.clsCertificazioni  myCertificazioni=new Comedata.SchedeRisorse.Certificazioni.clsCertificazioni();

Ereditare una classe in C#

public class WebForm1 : System.Web.UI.Page

Override di un metodo virtual

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));

 

Aggiungere un metodo ad una classe derivata

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

Invocare un metodo della classe istanziata

myCertificazioni.GetCertDip(valore)

 

Metodo Statico

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;

            }

      }

 

Array di Classi

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;}

        }

}

 

Struttura(struct)

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

 

Enumeratori(enum)

public enum Giorno
{
Domenica = 0,
Lunedì = 1,
Martedì = 2,
Mercoledì = 3,
Giovedì = 4,
Venerdì = 5,
Sabato = 6
}

se partono da 0 non è necessario specificarlo

Indexer

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 classe
MI[0]=100; //setting value to an indexer
Console.WriteLine(MI[0]); //accessing value of an indexer.
            }
}

 

Errori

Windows 2003

Sotto Win2003 il percoso relativo ../ viene sostituito da /

Disabilitare i messaggi generici di i.e.

Advanced/Show Friedly Http message

Gestione dell Eccezioni

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

Gestione Errori nell’oggetto Business

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

      }

}

 

Gestione Errori nell’ Interfaccia

(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”);

      }

}

 

Provocamento Errore Generico

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(“”);

Tipi di Exception

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

Visualizzazione degli Errori non Gestiti

N.B. ormai la pagina e’ andata in errore,quindi non sarà piuì’ possible visuallizare l’errore nel contesto

Della pagina.

Page_Error()

Exception objErr = Server.GetLastError().GetBaseException();

string ErrorMess = “Messaggio: “ + objErr.Message;

Response.Write(ErrorMess);

//Se lo metto evito la propagazione nei livelli successivi Server.ClearError();

Application_Error()

Web.Config

<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

Date

GetDateTimeFormats

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

Calendario gregoriano

 

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);

 

Data(formato short)

System.DateTime.Now.ToShortDateString()

Data-Ora corrente

System.DateTime.Now | DateTime.Now

Anno corrente

System.DateTime.Now.Year.ToString()

Convertire una data in short-date

DateTime dtNs = System.Convert.ToDateTime(sData).ToString()); myDataNasc.txtData.Value=dtNs.ToShortDateString();

Function IsDate(di vb)

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

 

Stringa

Format

String.Format(“{0:N2}”,ds.Tables[0].Rows[0][”COSTO”])

String.ToString("F" + precision);//X DECIMALI

Compare

(String.Compare(erRuolo.ERType, "CodiceUO", true) == 0)

Join

string.Join("|",array di stringhe);

Pattern

“d”      Short date       18/09/2005

“D”     Long date       Settembre 18, 2005

“F”      Full date & time (long)          Settembre 18, 2005 15:00:00 PM

Insert

Inserisce una stringa specificata in una posizione

string spippo=”capello”;

spippo=spippo.Insert(3,”p”);

“cappello”

 

Concatenare stringhe-Concat

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(“ !!!”);

 

Riempire stringhe-PadLeft,PadRight

Aggiunge caratteri rispettivamente a sinistra e a destra della stringa

Maiuscolo/Minuscolo

String sTitle=”cIaO”

sTitle.ToUpper();        CIAO

sTitle.ToLower();       ciao

 

Rimuovere caratteri-Remove

Elimina un dato numero di caratteri dalla stringa

Remove(start,count)

String sTitle=”elefante”;

sTitle.Remove(3,3)     elete

 

Sostituire caratteri-Replace

Sostituisce una stringa con un’altra

sSql=sSql.Replace(“:01”, “’” + sCod_Ancap + “’”);

Left/Right

Utilizza SubString

Es: left(sSql,3) = sSqlWhere.Substring(0,3)

 

Mid

Utilizza SubString

Es: mid(sSql,4,len(sSql)-1) = sSqlWhere.Substring(3,sSqlWhere.Length-1)

 

IndexOf

Serve per ritornare la posizione di una carattere partendo dall’inizio

if (keyName.IndexOf(“btnLente”)>=0)

Cercare sottostringhe-LastIndexOf

Serve per ritornare la posizione di una carattere partendo dalla fine

     

Estrarre sottostringhe-Substring

Serve per estrarre caratteri da una stringa partendo dalla fine

sGruppiAD=sGruppiAD.Substring(0,sGruppiAD.Length-1);//tolgo il | finale

 

Estrarre un carattere

      string sStr="flavio";

 

      char c= sStr[2];             //97 a

      string a= sStr[2].ToString();//a

      int b=(int) sStr[2];         //97

Empty

Server per controllare se una stringa e’ vuota      

if (variabile == String.Empty)

anzicchè if(variabile ==””)

StartsWith/EndsWith

Vede se la variabile pippo inizia o termina con “msg”

If (Pippo.StartsWith(“Msg”))==true)

Split,Join

Vedi array

Sequenze Escape-Verbatim

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

 

File/Directory

 

Riferimento ad un file

System.IO.FileInfo[] myFile=dir.GetFiles("Web.config");

Copia il file

myFile[0].CopyTo (VirtualPath + "\\Web.config",true);

Cancello il file

myFile[0].Delete();

Ritorna il nome del file con l'estensione

Path.GetFileName(postedImage.FileName)

Crea un nuova directory(attenzione ai diritti)

Directory.CreateDirectory(Server.MapPath("Foto\\Foto\\prova"));

Controlla se una directory esiste

if (Directory.Exists(Server.MapPath("Foto\\Foto\\prova"))))

Iterator

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);

            }

 

Array

Dichiarazione Array

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")

Impostare un valore

numbers[4] = 5;

Lettere.SetValue("A",1,2);

 

Leggere un valore

Test=(string)Lettere.GetValue(J,Carattere)

Upper-Lower bound

Int a=myArray.GetLowerBound(0);

int b=myArray.GetUpperBound(0);

Cercare Array

Restituisce l’indice dell’elemento pippo

Int index=myArray.LastIndexOf(index,”pippo”)

Split di una stringa

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

Join di un array

string sGruppiNew=string.Join(“,”,sParts);

Ciclo su elementi di un Array

for (int i=0;i<=sParts.Length-1; i++){}

Array di Classi

Line.Accounts = new Account[1]; // inizializzo la classe line a contenere 1 account

Line.Accounts[0] = SubAccount;

ArrayList

    'inizializza arraylist

    Dim ArrayL As New ArrayList()

    ArrayL.Add("primo")

    ArrayL.Add("secondo")

    ArrayL.Add("terzo")

 

Contains

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)

 

Multimensionale

//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();

}

Hash Table

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];

}

 

Get value

      IDictionaryEnumerator myEnumerator = hsAnno.GetEnumerator();

                  while ( myEnumerator.MoveNext() )

                  {

                        if (sData == myEnumerator.Key.ToString())

                             return myEnumerator.Value.ToString();

                  }

 

DataSet

Filtrare Dati sul dataset

myRowArray = dsCustomers.Select(“ContactName like ‘Kelly%’”);

vedi anche DataView

Sort Dataset

ds.Select("",sortField)

Creazione e Ritorno dataset

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);

 

Dataset EOF

If rs.eof à if ds.Tables[0].Rows.Count==0

Ciclare su un dataset

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++)

{

}

Valore di un campo nel DataSet

ds.Tables[0].Rows[0][0]

ds.Tables[0].Rows[i][”ID”];

Passaggio di un dataset da una pagina all’altra

1° pagina:

Session[”pippo”]=ds

2°pagina:

DataSet paperino=(DataSet) Session[”pippo”];

DataGrid1.DataSource=paperino;

DataGrid1.DataBind();

 

Estrarre i cambiamenti

Restituisce il dataset contenente solo le modifiche effettuate

Ds=DsMio.GetChanges();

Salvare i cambiamenti sul db

DataAdapter.Update(ds,Conn)

Commit cambiamenti

Salva sul dataset i cambiamenti effettuati.

Ds.AcceptChanges();

Continua in caso di errore

Non interrompre il processo di inserimento in caso di errore

SqlDataAdapetr.ContinueOnError

Delimitare i campi e i record(GetString)

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”)

Impostare la PK

Ds.Tables[0].PrimaryKey=DS.Tables[0].Column[1]

Aggiungere una colonna calcolata

DataColumn totalColumn =new DataColumn(“Total”,Type.GetType(“System.Decimal”));

TestKingDetails.Columns.Add(totalColumn;

totalColumn.Expression = “Quantity * UnitPrice”;

Rimuovere una colonna

Nell’IemDataBound():

e.Item.Cells.RemoveAt(8);

e.Item.Cells.RemoveAt(7);

e.Item.Cells.RemoveAt(6);

 

N.B.partire sempre dall’ultima

Inserire una riga

DataRow dr=null;

dr=ds.Tables[0].NewRow();

ds.Tables[0].Rows.InsertAt(dr,3); //in terza posizione

Cambiare il Root Element

Serve per impostare il root element del file xml associato

Ds.NameSpace=”Pippo”;

DataSet Tipizzato

E’ un tipo di dataset che conserva lo schema di un tabella attraverso lo Schema Xml

Creare un dataset da stringa 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

 

Creare un dataset da file Xml


ds.ReadXml(“percorso.xml”);

Serializzare un dataset in 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

 

Serializzare lo schema di un dataset

ds.WriteXmlSchema('c:\TK\StudentInfo.xsd')

Creare un dataset manualmente

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”});

Gestione Transazioni

Esempio

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;                         

}

 

DataGrig

Cambiare lo stile di una cella

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”;
     }
   }

Set Width Column/Invisible

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;

Set Align Column

DataGrid1.Columns(0).ItemStyle.HorizontalAlign=HorizontalAlign.Center

Bound Column

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)

Valore di una cella di una Bound Column

Da mettere nel dgTbGen_ItemCommand()

string codice=e.Item.Cells[2].Text;

Applicare uno stile ad una Bound column(Bold)

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)

 

Formattare dati in una bound column

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

 

Formattare una data nell’ItemDataBound

 DateTime fieldDate = Convert.ToDateTime(DataBinder.Eval(e.Item.DataItem, "HireDate", "{0:MM/dd/yyyy}"))            e.Item.Cells(1).Text = fieldDate

 

Binding dati nulli

<%# (DataBinder.Eval(Container.DataItem, “note”) & “”) %>

Button Column

E’ una colonna della DataGrid usata per la gestione della Selezione,Aggiornamento e Cancellazione del record selezionato.

Select

Evidenzia tutto il record del datagrid

<asp:ButtonColumn Text="Seleziona" CommandName="Select"></asp:ButtonColumn>

 

Template Column

E’ una colonna della DataGrid in cui e’ possibile aggiungere qualsiasi tipo di controllo come:

combo,checkbox,validator,…. ed associarlo al campo della Tabella.

Multiple column

(eliminare la label)

<ItemTemplate>

<%# DataBinder.Eval(Container, “DataItem.COD_GROUP”)%> -

<%# DataBinder.Eval(Container, “DataItem.DESCGROUP”)%>

</ItemTemplate>

Find Control

System.Web.UI.WebControls.CheckBox chkPrint=(System.Web.UI.WebControls.CheckBox)dg.Items[i].FindControl(“chkPrint”);

if (chkPrint.Checked==false)

{

sIn = sIn + idMov + „,“;

}

 

Find Control in Edit

TextBox txtMese=(TextBox)dg.Items[dg.EditItemIndex].FindControl("txtMese);

 

Formattare dati in una template column

<ItemTemplate>
               
<%#DataBinder.Eval(Container.DataItem,"Freight","{0:C}")%>//formatta i currency
</ItemTemplate>

<%#DataBinder.Eval(Container.DataItem,"ShippedDate","{0:dd-MMM-yyyy}")%//formatta la data

Cambiare il dato di una Template column

(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”:””

Applicare uno stile ad una Template column

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;

            }

 

Cast di una Template column

 

<ItemTemplate>

<%# ((DateTime)DataBinder.Eval(Container.DataItem,”Date”)).ToShortTimeString()%> -

</ItemTemplate>

 

Troncare i dati ad una Template column

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>

Valore di una cella di una Template  Column

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”))

HyperLink Column

E’ una colonna della DataGrid usata per la navigazione verso altre pagine.

DataBinding

dg.SetDataBinding(dataset, dataset.Tables[0].TableName)

DataKeyField

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();

Caricamento dati da un file Xml

Dim ds as New DataSet
ds.ReadXml(“percorso.xml”);
dg.DataSource = ds.Tables[0].DefaultView;
dg.DataBind();

Caricamento dati da un DataSet

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();

 

Caricamento dati da un DataView

Dg.DataSource=DV;
Dg.DataBind();

 

vedi DataView

Caricamento dati da un DataReader

MyDataGrid.DataSource = dr;
MyDataGrid.DataBind();

 

 

Item

Ciclo su gli item della Grid

for (int i=0;i<= dg.Items.Count -1 ;i++)

{}

 

Add item

dgItem = New DataGridItem(2, 0, ListItemType.Item)

DataGrid1.Controls(0).Controls.AddAt(2 + 2, dgItem)

 

Get item selected

DataGridItem dgItem=dgMisure.SelectedItem;

Eventi

DataGrid_Sort

Impostare AllowSorting=true

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();

 }

DataGrid_OnItemCreated

Si verifica all’aggiunta di ogni singolo item al Data Control.

 

e.Item.Cells(0).Attributes.Add(“align”, “Left”)

DataGrid_ItemDataBound

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;

      }

 

DataGrid_ItemCommand

Si verifica quando un control contenuto in un item richiede l’esecuzione di un comando.

If e.CommandName==”btnAbilita”

DataGrid_EditCommand

Evento che si scatena nel momento in cui clicco sul Button column ”Edit”.

MyDataGrid.EditItemIndex = (int)e.Item.ItemIndex;

BindGrid();

DataGrid_CancelCommand

Evento che si scatena nel momento in cui clicco sul Button column ”Cancel”.

MyDataGrid.EditItemIndex = -1;
BindGrid();
 

DataGrid_DeleteCommand

Evento che si scatena nel momento in cui clicco sul Button column ”Delete”.

Chiave=e.Item.Cells[2].Text
………………
BindGrid();
 

DataList

Carica dati da un dataste

Server

dl.DataSource=dtResults;

      dl.DataBind();
 
Client
      <HeaderTemplate>
                Product Name
      </HeaderTemplate>
         <ItemTemplate>
            <%#DataBinder.Eval(Container.DataItem, "ProductName").ToString()%>          
         </ItemTemplate>

ListBox

Caricamento dati da un DataSet

listContratti.DataSource=dsTipoCorsiContratti;

listContratti.DataTextField=”Id_Contratto”;

listContratti.DataValueField=”Id_Contratto”;

listContratti.DataBind();

 

Caricamento da una DataTable

 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);                                 

      }

Selezione multipla

//impostazione selezione multipla

lb.SelectionMode=ListSelectionMode.Multiple;

 

Controllo valori selezionati

            ListBox lbRoles=(ListBox)Page.FindControl("lbRoles");

            foreach (ListItem role in lbRoles.Items)

            {

                        if (role.Selected)

                        {

                                   string sValue=role.Value;

                                   string sText=role.Text;

                        }

            }

Combo

Controllare se e’ stato selezionato un elemento

cmbRuoloTerzo.SelectedItem !=null

Selezione elemento di una combo in base al value dell’elemento

ddlDipendenti.ClearSelection();//IMPORTANTE

if (ddlDipendenti.Items.FindByValue(Resp) != null)

ddlDipendenti.Items.FindByValue(e.Item.Cells[0].Text).Selected = true;

Valore dell’elemento selezionato in una combo

Web:

cmbRuoli.SelectedItem.Value

Form:

cmbRuoli.SelectedValue.ToString()

 

Valore elemento selezionato da enum

textBox1.Text = ((int) Enum.Parse(typeof(Settimana), comboBox1.SelectedValue.ToString(), true)).ToString();

Caricamento Combo da Enum

this.comboBox1.DataSource = Enum.GetValues(typeof(Settimana));

Caricamento Combo Form  da un DataSet

dropRuolo.DataSource = ds.Tables[0].DefaultView;

dropRuolo.DisplayMember = “DESCGROUP”;

dropRuolo.ValueMember = “COD_GROUP”;

Caricamento Combo Web  da un DataSet

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,””);

      }

 

Casting di un oggetto(Funziona solo se prima bindo la datagrid)

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];

 

Add Item

Lo aggiunge in coda,altrimenti usa insertAt

      ListItem myItem=new ListItem();

      myItem.Text=”pippo”;

      myItem.Value=”1”;

      cmb.Items.Add(myItem);

 

Remove Item

Elimina il 5 elemento

            Cmb.Items.RemoveAt(5)

 

Color item

Valido solo per html select

      ListItem item=cmbBlocco.Items.FindByValue("5");            item.Attributes.Add("style","color:red");

 

 

TreeView

Add Node To Tree

      TreeNode myRoot=new TreeNode();

      myRoot.ID=dt.Rows[i]["IDRILEVAZIONE"].ToString();

      myRoot.Text=dt.Rows[i]["RILEVAZIONE"].ToString();   

      Tree.Nodes.Add(myRoot)  

Add Node To Node

      TreeNode myRoot2=new TreeNode();

            myRoot.Nodes.Add(myRoot2)

Get Node from Index

TreeNode SelectedNode=Tree.GetNodeFromIndex(“1,0”);

Get Selected Node

TreeNode SelectedNode=Tree.GetNodeFromIndex(Tree.SelectedNodeIndex);

GetParentNode

TreeNode myNode=(TreeNode)myNode.Parent

Validator

Regular Expression

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

Lato Client

Page_ClientValidate

Metodo javascript che scorre l’array Page_Validators e richiama la funzione ValidatorValidate

Page_IsValid

Proprietà della pagina che ritorna true se la validazione e’ completata

Lato Server

Page.Validate()

Metodo server che una volta invocato provoca la validazione della pagina.

 

Page.IsValid

Attraverso questa proprieta’ e’ possibilie sapere,lato server,se la validazione della pagina e’ andata a buon fine o no.

 

Proprietà

CausesValidation

Proprietà di un controllo button che stabilisce se una volta cliccato il pulsante effettuare o meno la validazione della pagina.

 

ControlToValidate

Proprietà del validator che indica il controllo a cui la validazione fa riferimento.

EnableClientScript

Proprietà del validator che stabilisce se la validazione deve essere efettuata sul client o sul server.

 

Tipi

CompareValidator

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.

CustomValidator

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.... }

 

RangeValidator

Convalida un campo affinchè un valore sia compreso in un intervallo specificato.

RegularExpressionValidator

Assicura che il valore immesso corrisponda ad un criterio specificato.

Es:

numerico 2 cifre,3 decimali

(?!^0*$)(?!^0*\.0*$)^\d{1,2}(\.\d{1,3})?$

anche negativi:

^-?\d{1,2}(\.\d{1,3})?$

numerico postivo o negativo

^-?\d{1,}?$

RequiredFieldValidator(campo obbligatorio)

Assicura che venga immesso un valore nel campo specificato.

ValidationSummary

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

 

UserControl

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”);

 

 

U.C. sia graficamente che nel codeBehind(programmatica)

 

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” %>

U.C. nel codeBehind(drag e drop)

uc_btnBack myBack=(uc_btnBack)Page.FindControl(“Uc1”);

 

Dynamic Control (controls.add)

Perdita di ViewState

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.

 

Css

Css in una bound column(Funziona solo se prima bindo la datagrid)

(in EditMode)

System.Web.UI.WebControls.TextBox txtDataScad=(System.Web.UI.WebControls.TextBox)dgCertificazioni.Items[dgCertificazioni.EditItemIndex].Cells[4].Controls[0];

txtDataScad.CssClass=”Campotext”;

Css in una template column(Funziona solo se prima bindo la datagrid)

System.Web.UI.WebControls.DropDownList cmbTemplateCert=(System.Web.UI.WebControls.DropDownList)dgCertificazioni.Items[dgCertificazioni.EditItemIndex].FindControl(“cmbTemplateCertif”);

cmbTemplateCert.CssClass=”Campotext”;

Css in una TreeView

TreeFunzioni.DefaultStyle= “font: 10px Verdana, Arial”

Css in un Controllo generico

ComboSkill.CssClass=”Campotext”;

 

Global.asax

Pagina di Errore Custom

void Application_Error(Object sender, EventArgs E) {
Context.ClearError();
Response.Redirect(“errorpage.htm”);
    }

 

Xml

            <Authors>

            <Author>

                        <FirstName>John</FirstName>

                        <LastName>Doe</LastName>

            </Author>

            <Author>

                        <FirstName>Jane</FirstName>

                        <LastName>Eod</LastName>

            </Author>

            </Authors>

 

Leggere i nodi da file

 

            XmlDocument _doc = new XmlDocument( );

            _doc.Load( _strFilename);

            XmlNodeList myNodeList = _doc.GetElementsByTagName( "FirstName" );

 

            ForEach(XmlNode myNode in myNodeList)

            {

                        string a=myNode.InnerText;

            }

 

Leggere i nodi da stringa

           

            XmlDocument _doc = new XmlDocument( );

            _doc.LoadXml( xmlText);

            XmlNodeList myNodeList = _doc.GetElementsByTagName( "FirstName" );

 

            ForEach(XmlNode myNode in myNodeList)

            {

                        string a=myNode.InnerText;

            }

WebConfig

E’ un file Xml che viene utilizzato per memorizzare le impostazioni di configurazione di un sito.

Settare un Parametro nel WebConfig

<appSettings>

<add key=”ConnString” value=”User ID=app_Formazione;password=formazione;Initial Catalog=PROG_test;Data Source=S6” />

</appSettings>

Leggere un Parametro dal WebConfig

Puo’ essere utilizzato in qualsiasi pagina aspx o in qualsiasi oggetto.

string sStringaConn = ConfigurationSettings.AppSettings[”ConnString”];

n.b. includere System.Configuration.

Elenco parametri WebConfig

Trace

Attiva – disattiva l’analisi dell’applicazione

Pages

Imposta attributi a livelllo di pagina(Buffer,SessionState,ViewState)

SessionState

Gestione delle sessioni

RequiredRuntime

Indica quale versione del FrameWork utilizzare (solo in app.config)
<configuration>
<startup>
<requiredRuntime version=”v1.0.2605” safemode=”true”/>
</startup>
</configuration>

CustomErrors

Visualizza o meno gli errori(Off visualizza tutti gli errori)
<customErrors mode=”RemoteOnly/On/Off”/>

Compilation

Attiva o no la compilazione delle pagine
<compilation debug=”true”/>
N.B. In produzione togliere il debug

MachineConfig

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

Passaggio di Parametri

Response

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)

Request

sCont= Request.Params[”Cont”];

Cache

Vedi anche Caching

Inserisco:

Cache(“miaChiave”) = “mioValore”

Leggo:

valore = Cache(“miaChiave”) oppure valore = Cache.Get(“miaChiave”)

Transfer-Redirect

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”);

Session

1° pagina:

Session[”pippo”]=ds

2°pagina:

DataSet paperino=(DataSet) Session[”pippo”];

DataGrid1.DataSource=paperino;

DataGrid1.DataBind();

 

Cookie

Impostare un cookie

String sGruppiAD=”pippo”;

Response.Cookies[”SchedeRisorse”][”GruppiAD”] = sGruppiAD;

Leggere da un cookie

string sGruppi=Request.Cookies[”SchedeRisorse”][”GruppiAD”];

Cookie persistenti

vengono scritti sul filesystem

Cookie di sessione

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)

Creazione di un nuovo cookie

HttpCookie cookie = new HttpCookie("BackUrl");

Riferiemento ad un cookie gia esistente

HttpCookie cookie = HttpContext.Current.Request.Cookies["BackUrl"];

Scrivere nel cookie

cookie.Value

Aggiungere il cookie alla collezione

HttpContext.Current.Response.Cookies.Add(cookie);

Distruzione coookie

cookie.Expires=DateTime.Now.AddDays(-1);//distruggo il cookie solo se persistente

 

ViewState

Impostare un ViewState

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(Chiave,Valore)

ViewState.Add(“Funz”,Funzione.ToString());

ViewState[“Funz”]=Valore;

Leggere da un ViewState

String sFunz=ViewState[”Funz”]

sFunz=(string)ViewState[“Funz”]

Controllare se un ViewState e’ valido

ViewState[”AreaId”]!= null

Disabilitare un ViewState

Per disabilitare il viewstate di un controllo impostare la proprietà EnableViewState=False

Property Page

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;

 

Context

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.

Caching

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”];

Authentication

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]”>

Forms Authentication

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()

 

Basic Authentication

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)

 

Windows Authentication(Integrated)

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

Rappresentazione

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"/>
<authentication mode="Windows" />

HttpContext
WindowsIdentity
Thread

-
MACHINE\IUSR_MACHINE
-

<identity impersonate="false"/>
<authentication mode="Windows" />

HttpContext
WindowsIdentity
Thread

-
MACHINE\ASPNET
-

<identity impersonate="true"/>
<authentication mode="Forms" />

HttpContext
WindowsIdentity
Thread

Name provided by user
MACHINE\IUSR_MACHINE
Name provided by user

<identity impersonate="false"/>
<authentication mode="Forms" />

HttpContext
WindowsIdentity
Thread

Name provided by user
MACHINE\ASPNET
Name provided by user

Table 2. IIS basic authentication

Web.config Settings

Variable Location

Resultant Identity

<identity impersonate="true"/>
<authentication mode="Windows" />

HttpContext
WindowsIdentity
Thread

Domain\UserName
Domain\UserName
Domain\UserName

<identity impersonate="false"/>
<authentication mode="Windows" />

HttpContext
WindowsIdentity
Thread

Domain\UserName
MACHINE\ASPNET
Domain\UserName

<identity impersonate="true"/>
<authentication mode="Forms" />

HttpContext
WindowsIdentity
Thread

Name provided by user
Domain\UserName
Name provided by user

<identity impersonate="false"/>
<authentication mode="Forms" />

HttpContext
WindowsIdentity
Thread

Name provided by user
MACHINE\ASPNET
Name provided by user

Table 3. IIS digest authentication

Web.config Settings

Variable Location

Resultant Identity

<identity impersonate="true"/>
<authentication mode="Windows" />

HttpContext
WindowsIdentity
Thread

Domain\UserName
Domain\UserName
Domain\UserName

<identity impersonate="false"/>
<authentication mode="Windows" />

HttpContext
WindowsIdentity
Thread

Domain\UserName
MACHINE\ASPNET
Domain\UserName

<identity impersonate="true"/>
<authentication mode="Forms" />

HttpContext
WindowsIdentity
Thread

Name provided by user
Domain\UserName
Name provided by user

<identity impersonate="false"/>
<authentication mode="Forms" />

HttpContext
WindowsIdentity
Thread

Name provided by user
MACHINE\ASPNET
Name provided by user

Table 4: IIS integrated Windows

Web.config Settings

Variable Location

Resultant Identity

<identity impersonate="true"/>
<authentication mode="Windows" />

HttpContext
WindowsIdentity
Thread

Domain\UserName
Domain\UserName
Domain\UserName

<identity impersonate="false"/>
<authentication mode="Windows" />

HttpContext
WindowsIdentity
Thread

Domain\UserName
MACHINE\ASPNET
Domain\UserName

<identity impersonate="true"/>
<authentication mode="Forms" />

HttpContext
WindowsIdentity
Thread

Name provided by user
Domain\UserName
Name provided by user

<identity impersonate="false"/>
<authentication mode="Forms" />

HttpContext. WindowsIdentity
Thread

Name provided by user
MACHINE\ASPNET
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()

GetIdentity

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;

 

Credenziali

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;

Authorization

E’ quel processo utilizzato per assegnare permessi e diritti ad un utente.

 

1.      Esistono due forme di Autorizzazione:

§  ACL NTFS

§  URL

Consenti l’accesso all’utente King

<authorization>

<allow users=”spin\King”>

</authorization>

Vietare l’accesso all’utente King

<authorization>

<deny users=”spin\king”>

<allow users=”*”>

</authorization>

Vietare l’accesso anonimo

<authorization>

<deny users=”?”>

</authorization>

 

Vieta l’accesso alla cartella xxx

<location path='/apps/resumeApplication'>

<system.web>

<authorization>

<deny users=“spin\king” />

</authorization>

</system.web>

 

Consenti l’accesso alla classe

<PrincipalPermissionAttribute(SecurityAction.Demand, Name := 'JAMES')>

Public Class MyClass…..

Localization/Culture

Le impostazioni della cultura vengono prese dal pannello di controllo

Capire il formato di un numero per la cultura corrente

string pippo=NumberFormatInfo.CurrentInfo.NumberDecimalDigits.ToString();

 

Modificare la cultura corrente

Thread.CurrentThread.CurrentCulture=new CultureInfo(“de-DE”);

 

Modificare la data in base alla cultura

CultureInfo culture = new CultureInfo("it-IT");

 

DateTime dtInizio = System.Convert.ToDateTime(myDataInzio.getData(),culture);

 

Funzioni generiche

Funzioni di conversione

System.Convert.ToDecimal

System.Convert.ToString

System.Convert.ToDouble

DateTime dtData=System.Convert.ToDateTime

System.Convert.ToInt32 oppure Int32.Parse

     

Cast

Int aint;

Long along=1000;

aint=(int)along; //esplicito

 

Crystal Reports

Report Viewer

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

Interoperability

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:

 

  1. Add reference da vs.net
  2. tlbImp.exe da riga di comando(vedi tool)

 

AspCompat

Questo attributo a livello di pagina,si usa quando una pagina fa uso di un componente Com.Viene forzata l’esecuzione in STA.

Referenziare oggetto Com

AddRefeence /Com Tab

Selezionare la dll Com

Referenziare una dll Api

[DllImport("TestKingFunctions.dll")]

public static extern int CalculateValue(int x);

 

Restringere l’accesso alla dll com+

Sotto Com+ settare la proprietà identity dell’apllicazione che contiene le dll

 sull’utente da autorizzare.

Distruzione oggetto Com+

E’ importante distruggere l’oggetto,altrimenti rimane appeso

 

System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);

Debug

Capire se si e’ in Debug o Release

Compilazione condizionale

#if DEBUG

alert(“Debug”);

#EndIf

Debug Componente Com+

Fare l’Attach sul processo:dllHost.exe

Debug Lato Client

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

Debug remoto di un progetto Web

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

 

Debug WebServices

First we start the service, and then we attach the debugger to it. We must attach to available running processes.

 

Stampare una stringa nella window Output-Debug

System.Diagnostics.Debug.Write(“pippo”);

 

PostBack

Controllo che ha causato il postBack

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

Controllare il postBack sul client

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>

 

PostBack su popup

function Post()

{

var pagina=window.open('','pippo','location=no,scrollbars=yes');

document.Form1.target='pippo';

document.getElementById("btnCerca").click();

}

 

Causare il PostBack

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>

Remoting vs Web services

Remoting (omogeneo)

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).

Web Services (eterogeneo)

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).

 

Varie

TypeOf

Serve per determinare se un oggetto derivi da una particolare classe o interfaccia.

Processi

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+)

Utilizzo Assembly in Com

Registrare l’assembly .Net con RegAsm

CreateObject (“Namespace.Classe”)

 

Refresh di una pagina

Permette il refresh di una pagina ogni 5 secondi

<META HTTP-EQUIV=”REFRESH” CONTENT=”5”>

Controlli

Creare un controllo Web programmaticamente

Es:CustomValidator

System.Web.UI.WebControls.CustomValidator myCuVal=new System.Web.UI.WebControls.CustomValidator();

myCuVal.ClientValidationFunction=”checkAlert”;

myPage.Controls.Add(myCuVal);//lo aggiungo alla pagina

 

Gestire gli enventi di un controllo dinamico

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);

Aggiungere un controllo in un Form programmaticamente

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);

Ciclo su i controlli di una page

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.

Ottenere il nome e il tipo del controllo

     System.Web.UI.Control c;

string nome = c.ClientID;

string tipo = c.GetType().ToString();

Aggiungere attributi ad un controllo web

Impostare:

chk1.Attributes.Add(“value”,”-1”)

Leggere:

string a=chk1.Attributes[”value”];

 

Aggiungere controlli dinamicamente(Parsing)

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");
}

Eventi di un WebForm

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.

 

Richiamare una windows form

AnaColl_Test myForm=new AnaColl_Test();

myForm.Show();

Pagina di errore centralizzata

Vedi Global.asax

Numero random

Random rnd=new Random();

Short num1=Convert.ToInt16(rnd.Next(35000));

Tracing di una pagina

Funziona sia in modalità Debug/Release

<%@ Page Trace=”true” %> sulla pagina

oppure

<trace enabled=”true” pageOutput=”true”/> nel WebConfig

 

Tracing su un file

Trace.Listeners.Add( new TextWriterTraceListener( “N:\\ankhlog.txt” ) )¨;

Uscire da un ciclo

Break;

Uscire da una Sub o Function

Return;

 

Inibire l’uscita del focus da una text

Private void txtPass_Validiting(object sender,System.ComponentModel.CancelEventArgs e)

{

If (!ValidPassword())

e.Cancel=true;

}

Istanziare un pagina o report

myRpt = new FormazioneDipendenti.Reports.rptAnalisiCorsi()

 

Controllare se un campo Db contiene Null

(ds.Tables[0].Rows[0][”DATA_CORSO”]!=System.DBNull.Value)

 

Controllare se un oggetto e’ null

If (obj !=null)

 

Controllare un oggetto client dal server

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”);

 

Javascript

Messaggio Conferma click pulsante server

(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?’);”);

Eseguire Codice Javascript sul client

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());

Aprire una pagina da Javascript

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

Scrivere variabili Server in Javascript

<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()%>

 

Scrivere un alert da codice server

Response.Write("<script>alert(\"No file selected for upload\\nPlease click browse and select the file you wish to upload\");</script>");

 

Visualizzazione finestra Immediata (Ctrl+Alt+A,impostazioni C#)

Digitare >immed per passare alla modalità immediata myVar

1.      Digitare >cmd per passare alla modalità comando

?myVar

Server MapPath

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

Impostare un oggetto a null (distruzione)

Obj=null;(in C# ci pensa la GAC)

SmartNavigation

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

 

Colore

System.Drawing.Color.Red

Cursore

Windows Form:

Cursor.Current = Cursors.WaitCursor;

 

WebForm:

btnCalcola.Attributes.Add("OnClick","document.body.style.cursor='wait';");

Upload di un file


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>

Installazione

Copy Project

    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.

Xcopy

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

 

 

Pacchetto Installazione

Custom Action

Permette di eseguire delle operazioni durante il setup(eseguire script sql o precompilare con ngen l’applicazione)

Launch Condition

blocca l'installazione se una determinata condizione non viene soddisfatta.

 

Creare un SetupCab

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”

Scenari

Far sopravvivere lo stato al riavvio IIS

1.      Utilizzare StateServer come un servizio esterno ad aspnet_wp sullo stesso o altro server.

2.      Utilizzare SqlServer come StateServer

 

Session senza Cookie

Inserire nel machine.config <sessionstate cookieless=true>

L’identificativo di sessione viene passato direttamente nell’url.

Concetti

Differenza tra Oggetto e Classe

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.

Istanziare 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();

 

Implementare un’interfaccia

Una classe puo’ ereditare una classe base e implementare una o piu’ interfacce.

Vedi definizione.

Ereditarietà

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.

Aggregazione COM

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.

Polimorfismo

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.

Incapsulamento

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)

OverLoad dei Metodi

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.

Override dei Metodi Virtual

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

 

Processo

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.

Lanciare un processo da codice

 

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();

Thread

Unità di base di esecuzione codice.Possibilità di far girare pezzi di codice in parallelo(MultiThreading).

Un processo puo’ avere piu thread.

MultiThreading

C# suppporta il multithreading,Vb 6 no.

Lanciare in parallello piu pezzi di codice all’interno dello stesso processo.

 

Postback

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.

 

Serializzazione

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.

Deserializzazione

Per leggere lo stato degli oggetti o dei valori che vengo resi permanenti mediante serializzazione,occorre la deserializzazione.

 

Reflection

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);

 

Crittografia

Chiave simmetrica

Stablisce che la stessa chiave sia in grado di cifrare e decifrare un file.

Chiave asimmetrica

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).

Chiave pubblica-privata

E’ un tipo di crittografia a chiave asimmetrica,che assicura:

  1. il documento provenga dal mittente che si aspetta il destinatario.
  2. il mittente e’ sicuro che solo il destinatario possa leggere il documento.

 

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.

Firma elettronica

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.

 

Casting

Esplicito

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;

Implicito

Viene invocata esplicitamente senza usare il “Cast”.Utilizzare conversione implicite puo’ portare a codice ‘confuso’.

int i = x;

SomeType x;

Sintassi

Enum

public enum FileMode

      {

Append,

Create,

CreateNew,

Open,

OpenOrCreate,

Truncate

      }

     

FileMode.Append

Const

public const string RicercaOfferta=”2”;

Operatori Logici

And = &&

Or= ||

 

Cicli

Uscire da un ciclo

Per uscire da un cliclo usare Break;

Incrementare in un ciclo

Continue;

Ciclo While

while (n < 100)

n++;

Ciclo While post condizionato

      do                     

      {

            Test=”5”;

            J=J+1;

      }

      while(Temp!=Test);

Ciclo For

for (int i=1;i<=10;i++)

                                   {

                                   }

Ciclo For Each

foreach (int i in iArray)

                                   {

                                   }

If  … Else

If (i = = 5)

{

total=1;

}

else

{

totale=2;

}

 

If inline

(DataBinder.Eval(Container, “DataItem.COD_COLORE”).ToString()==”R”)?”OBBLIGATORIA”:(DataBinder.Eval(Container, “DataItem.COD_COLORE”).ToString()==”G”)?”FACOLTATIVA”:””

 

Goto

 

If (condizione)

            goto label;

 

label:

            operazioni

 

Commenti

//  single line

/* multiline */

Dichiarare una Variabile

Int x;

Int x=10;

Case

Il default viene raggiunto se nessun case e’ soddisfatto

 

switch(n)

{

case 0:

total=0;

                        break;  obbligatorio

            default:

                        total=1;

                        break;

            }

 

Funzioni

         Asc

        int intForA = (int) 'A';

         Chr

               char charFor65 = (char)65;

         Mod

                        3%2=1

            Rnd

Random rnd=new Random();

rnd.Next(11);//da 0 a 10

rnd.Next(1,91);//da 1 a 90                  

Trucchi Javascript

Leggere il valore di un ogetto server

document.getElementById('<%=lblOff.ClientID%>').value

Aprire una pagina a schermo pieno

<script language=Javascript> window.open(“pagina.htm”,””,”fullscreen,scrollbars”)

</script>

If senza usare Javascript

n.b.Funziona solo con i.e.

<!--[if IE]>

Qui il codice per MsIE

<![endif]-->

 

Disabilita il pulsante che provoca il post

Cosi’ evita che l’utente provi ad inserire piu’ volte lo stesso valore

<body onbeforeunload="javascrip:document.getElementById('btnInsert').disabled = true;">

No Back browser

Fa scadere l’history della pagina

<%@ OutputCache Duration = "1" Location = "server" VaryByParam = "none"%>

No Cache

      Response.CacheControl = "no-cache";

      Response.AddHeader("Pragma", "No-Cache");

      Response.Expires = -1;

      Response.Cache.SetNoServerCaching();    

Richiamare una pagina senza inserirla nella History

<a href=javascript:location.replace(“nuova-pagina.htm”)>Collegamento</a>

oppure

<META http-equiv=”REFRESH” content=”0; url=pagina.htm”>

Ricaricare la pagina opener

window.opener.location.reload(true);

Leggere una combo

document.getElementById('sc').options[document.getElementById('sc').selectedIndex].text (.value)

Andare a capo

/n

 

Show Modal Dialog

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

 

Window opener

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