<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Exam 70-526  Windows-Based Client Development</title>
        <link>http://blogs.ugidotnet.org/angellaa/category/Exam 70-526  Windows-Based Client Development.aspx</link>
        <description>Exam 70-526  Windows-Based Client Development</description>
        <language>it-IT</language>
        <copyright>Andrea Angella</copyright>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>[70-526] - ADO.NET in modalit&amp;agrave; connessa e Transazioni</title>
            <link>http://blogs.ugidotnet.org/angellaa/archive/2008/03/12/91650.aspx</link>
            <description>&lt;h4&gt;&lt;strong&gt;Area di riferimento&lt;/strong&gt;&lt;/h4&gt;  &lt;p&gt;- Integrating Data in a Windows Forms Application    &lt;br /&gt;    - Manage connections and transactions     &lt;br /&gt;        - Perform transactions by using the Transaction object     &lt;br /&gt;    - Create, add, delete, and edit data in a connected environment&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;Eseguire comandi in un contesto transazionale        &lt;br /&gt;&lt;/font&gt;&lt;/strong&gt;    &lt;br /&gt;La classe &lt;strong&gt;SqlCommand&lt;/strong&gt; permette la creazione di un comando (in sostanza una query SQL). La collection &lt;strong&gt;Parameters&lt;/strong&gt; permette di aggiungere parametri (istanze di &lt;strong&gt;SqlParameter&lt;/strong&gt;) nel caso in cui si utilizzino query parametriche ed è bene farlo per evitare attacchi di tipo SQL Injection. Il metodo &lt;strong&gt;ExecuteNonQuery&lt;/strong&gt; esegue query che non richiedono l'analisi di un risultato, nell'esempio comandi di inserimento.     &lt;br /&gt;Per eseguire dei comandi in un contesto transazionale è necessario costruire un oggetto &lt;strong&gt;Transaction&lt;/strong&gt; utilizzando il metodo &lt;strong&gt;BeginTransaction&lt;/strong&gt; della classe Connection specificando eventualmente un parametro per definire il comportamento di blocco della connessione. Inoltre per ogni comando è necessario impostare la proprietà Transaction all'oggetto appena creato (o passarlo direttamente nel costruttore di Command).     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Di seguito mostro un esempio di esecuzione di due comandi per inserire studenti. Questi due comandi saranno eseguiti all'interno di un unico contesto transazionale:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;// Dati che voglio inserire nella tabella Studente            &lt;br /&gt;&lt;/font&gt;string nome1 = "Andrea";           &lt;br /&gt;string cognome1 = "Angella";           &lt;br /&gt;string nome2 = "Laura";           &lt;br /&gt;string cognome2 = "Angella"; &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;SqlConnection conn = null;          &lt;br /&gt;&lt;font color="#ff0000"&gt;SqlTransaction transaction = null;&lt;/font&gt; &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;try          &lt;br /&gt;{           &lt;br /&gt;   &lt;font color="#008000"&gt;// Costruisco e apro la connessione&lt;/font&gt;           &lt;br /&gt;    conn = new SqlConnection(connectionString);           &lt;br /&gt;    conn.Open(); &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;    &lt;font color="#008000"&gt;// Costruisco un oggetto Transaction&lt;/font&gt;           &lt;br /&gt;    &lt;font color="#ff0000"&gt;transaction = conn.BeginTransaction(IsolationLevel.Unspecified);&lt;/font&gt; &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;    &lt;font color="#008000"&gt;// Costruisco due oggetti command utilizzando i parametri            &lt;br /&gt;&lt;/font&gt;    SqlCommand command1;           &lt;br /&gt;    command1 = new SqlCommand("insert into Studente(Nome, Cognome) values (@Nome, @Cognome)",           &lt;br /&gt;                              conn, &lt;font color="#ff0000"&gt;transaction&lt;/font&gt;);           &lt;br /&gt;    &lt;font color="#ff0000"&gt;command1.Parameters.Add(new SqlParameter("@Nome", nome1));            &lt;br /&gt;&lt;/font&gt;    command1.Parameters.Add(new SqlParameter("@Cognome", cognome1)); &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;    SqlCommand command2;          &lt;br /&gt;    command2 = new SqlCommand("insert into Studente(Nome, Cognome) values (@Nome, @Cognome)",           &lt;br /&gt;                              conn, transaction);           &lt;br /&gt;    command2.Parameters.Add(new SqlParameter("@Nome", nome2));           &lt;br /&gt;    command2.Parameters.Add(new SqlParameter("@Cognome", cognome2)); &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;    &lt;font color="#008000"&gt;// Eseguo i comandi in uno stesso contesto transazionale            &lt;br /&gt;&lt;/font&gt;    &lt;font color="#ff0000"&gt;command1.ExecuteNonQuery();            &lt;br /&gt;&lt;/font&gt;    command2.ExecuteNonQuery(); &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;    &lt;font color="#008000"&gt;// Eseguo il commit della transazione&lt;/font&gt;           &lt;br /&gt;   &lt;font color="#ff0000"&gt;transaction.Commit();            &lt;br /&gt;&lt;/font&gt;}           &lt;br /&gt;catch(Exception ex)           &lt;br /&gt;{           &lt;br /&gt;    &lt;font color="#008000"&gt;// Se si è verificato un errore faccio Rollback della transazione            &lt;br /&gt;&lt;/font&gt;    if (transaction != null)           &lt;br /&gt;    {           &lt;br /&gt;        &lt;font color="#ff0000"&gt;transaction.Rollback(); &lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;        MessageBox.Show("Si è verificato un errore:\n" + ex.Message);          &lt;br /&gt;    }           &lt;br /&gt;}           &lt;br /&gt;finally           &lt;br /&gt;{           &lt;br /&gt;    if (conn != null)           &lt;br /&gt;    {           &lt;br /&gt;        conn.Close();           &lt;br /&gt;    }           &lt;br /&gt;}&lt;/strong&gt;&lt;/font&gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;   &lt;br /&gt;I possibili valori della enumerazione IsolationLevel sono:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Chaos&lt;/strong&gt;: le modifiche in sospeso della transazione di livello più alto non possono essere sovrascritte &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;ReadCommitted&lt;/strong&gt;: i blocchi condivisi sono mantenuti mentre i dati vengono letti, ma i dati possono essere modificati prima della fine della transazione &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;ReadUncommitted&lt;/strong&gt;: non viene generato alcun vlocco condiviso e non viene generato alcun blocco esclusivo &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;RepeatableRead&lt;/strong&gt;: sono imposti blocchi esclusivi su tutti i dati utilizzati nella query &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Serializable&lt;/strong&gt;: un blocco di intervallo viene imposto sul DataSet &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Unspecified&lt;/strong&gt;: un livello di isolamento esistente non può essere determinato       &lt;br /&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;Lettura dei dati da una tabella&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Utilizzare un &lt;strong&gt;DataReader&lt;/strong&gt; per scorrere fra i risultati di una query è un'operazione molto semplice.     &lt;br /&gt;Di seguito riporto il codice per leggere tutti gli studenti presenti nella tabella Studente e inserire il loro nome e cognome all'interno di una listBox:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;SqlConnection conn = new SqlConnection(connectionString);                      &lt;br /&gt;conn.Open();           &lt;br /&gt;SqlCommand command = new SqlCommand("select * from Studente", conn); &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;SqlDataReader reader = command.ExecuteReader();&lt;/font&gt; &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;listBox1.Items.Clear();          &lt;br /&gt;while (&lt;font color="#ff0000"&gt;reader.Read()&lt;/font&gt;)           &lt;br /&gt;{           &lt;br /&gt;    listBox1.Items.Add(&lt;font color="#ff0000"&gt;reader["Nome"]&lt;/font&gt; + ", " + &lt;font color="#ff0000"&gt;reader["Cognome"]&lt;/font&gt;);           &lt;br /&gt;} &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;conn.Close();&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.ugidotnet.org/angellaa/aggbug/91650.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Angella</dc:creator>
            <guid>http://blogs.ugidotnet.org/angellaa/archive/2008/03/12/91650.aspx</guid>
            <pubDate>Wed, 12 Mar 2008 00:19:28 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/angellaa/archive/2008/03/12/91650.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/angellaa/comments/commentRss/91650.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/angellaa/services/trackbacks/91650.aspx</trackback:ping>
        </item>
        <item>
            <title>[70-526] - Gestione delle connessioni</title>
            <link>http://blogs.ugidotnet.org/angellaa/archive/2008/03/11/91648.aspx</link>
            <description>&lt;h4&gt;&lt;strong&gt;Area di riferimento&lt;/strong&gt;&lt;/h4&gt;  &lt;p&gt;- Integrating Data in a Windows Forms Application    &lt;br /&gt;    - Manage connections&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;Gestione delle connesssioni&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Ci sono diversi modi per configurare una connessione ad una base di dati.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Configurare una connessione utilizzando Server Explorer &lt;/li&gt;    &lt;li&gt;Configurare una connessione utilizzando il Connection Wizard &lt;/li&gt;    &lt;li&gt;Configurare una connessione utilizzando la classe Connection e quelle specifiche &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Di seguito alcune immagini che mostrano come avviare i primi due wizard:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/angellaa/WindowsLiveWriter/70526Gestionedelleconnessionietransazion_18CF/2008-03-11_010745_2.jpg"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="178" alt="2008-03-11_010745" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/angellaa/WindowsLiveWriter/70526Gestionedelleconnessionietransazion_18CF/2008-03-11_010745_thumb.jpg" width="244" border="0" /&gt;&lt;/a&gt; &lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="74" alt="2008-03-11_010842" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/angellaa/WindowsLiveWriter/70526Gestionedelleconnessionietransazion_18CF/20080311_010842.jpg" width="241" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;Il framework mette a disposizione diverse classi Connection specifiche: &lt;strong&gt;SqlConnection&lt;/strong&gt;, &lt;strong&gt;OleDbConnection&lt;/strong&gt;, &lt;strong&gt;OdbcConnection&lt;/strong&gt;, &lt;strong&gt;OracleConnection&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="181" alt="2008-03-11_011802" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/angellaa/WindowsLiveWriter/70526Gestionedelleconnessionietransazion_18CF/20080311_011802.jpg" width="366" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;Ecco un esempio di creazione di oggetti di tipo Connection:    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img height="153" alt="2008-03-11_013116" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/angellaa/WindowsLiveWriter/70526Gestionedelleconnessionietransazion_18CF/20080311_013116_1.jpg" width="1044" border="0" /&gt;     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Per aprire e chiudere una connessione è sufficiente chiamare i metodi &lt;strong&gt;Open&lt;/strong&gt; e &lt;strong&gt;Close&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;E' possibile utilizzare gli eventi della connessione per ottenere informazioni dal database. L'evento &lt;strong&gt;StateChangedEvent&lt;/strong&gt; è sollevato quando lo stato corrente del database cambia da aperto a chiuso. L'evento &lt;strong&gt;InfoMessage&lt;/strong&gt; viene sollevato quando il server vuole notificare warning o messaggi.     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="50" alt="2008-03-11_014429" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/angellaa/WindowsLiveWriter/70526Gestionedelleconnessionietransazion_18CF/20080311_014429.jpg" width="619" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="155" alt="2008-03-11_014434" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/angellaa/WindowsLiveWriter/70526Gestionedelleconnessionietransazion_18CF/20080311_014434_1.jpg" width="555" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;       &lt;br /&gt;Pool delle connessioni&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Per ridurre l'overhead della creazione e distruzione di connessioni è importante utilizzare il pool delle connessioni. Il pool delle connessioni è attivato di default quando vengono creati oggetti connessione di ADO.NET. Per disattivare il pooling basta impostare a false la proprietà &lt;strong&gt;Pooling&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Di default l'oggetto SqlConnection automaticamente utilizza il connection pooling. E' possibile aggiungere delle parole chiave all'interno della stringa di connessione per controllarne il comportamento.    &lt;br /&gt;E' possibile utilizzare in particolare:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;"&lt;u&gt;Connection Lifetime&lt;/u&gt;": la connessione sarà distrutta dopo un certo numero di secondi qui impostati &lt;/li&gt;    &lt;li&gt;"&lt;u&gt;Max Pool Size&lt;/u&gt;": il numero massimo di connessioni permesse nel pool per la specifica stringa di connessione &lt;/li&gt;    &lt;li&gt;"&lt;u&gt;Min Pool Size&lt;/u&gt;": il numero minimo di connessioni permesse nel pool &lt;/li&gt;    &lt;li&gt;"&lt;u&gt;Pooling&lt;/u&gt;": per attivare o meno il connection pooling &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Proprietà analoghe sono inseribili nelle stringhe di connessione per Oracle.&lt;/p&gt;  &lt;p&gt;Con OLE DB è possibile controllare l'uso del pooling aggiungendo la parola chiave &lt;strong&gt;services&lt;/strong&gt; alla stringa di connessione.     &lt;br /&gt;E' possibile utilizzare:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;"&lt;u&gt;OLE DB Services = -1&lt;/u&gt;": tutti i servizi sono attivi&lt;/li&gt;    &lt;li&gt;"&lt;u&gt;OLE DB Services = -4&lt;/u&gt;": tutti i servizi attivi eccetto il Pooling e AutoEnlistment di transazionie &lt;/li&gt;    &lt;li&gt;"&lt;u&gt;OLE DB Services = -5&lt;/u&gt;": tutti i servizi attivi eccetto Client Cursor &lt;/li&gt;    &lt;li&gt;"&lt;u&gt;OLE DB Services = -8&lt;/u&gt;": tutti i servizi attivi eccetto Pooling, AutoEnlistment e Client Cursor. &lt;/li&gt;    &lt;li&gt;"&lt;u&gt;OLE DB Services = 0&lt;/u&gt;": nessun servizio attivo &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Con ODBC per attivare o disattivare il pooling si deve utilizzare la finestra di dialogo "&lt;strong&gt;ODBC Data Source Administrator&lt;/strong&gt;" in Windows.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;       &lt;br /&gt;Gestione delle eccezioni&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Quando si vuole eseguire una query su un server di database è estremamente importante gestire in maniera opportuna le eccezioni che potrebbero essere sollevate.   &lt;br /&gt;La collection &lt;strong&gt;Errors&lt;/strong&gt; in un oggetto di tipo SqlException contiene tutti gli errori forniti dal dbms.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="418" alt="2008-03-11_022125" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/angellaa/WindowsLiveWriter/70526Gestionedelleconnessionietransazion_18CF/20080311_022125_1.jpg" width="418" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;Enumerare le istanze di SQL Server disponibili su una rete&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Per ottenere la lista dei SQL Server disponibili si utilizza la proprietà &lt;strong&gt;Instance&lt;/strong&gt; della classe &lt;strong&gt;SqlDataSourceEnumerator&lt;/strong&gt; per poi chiamare il metodo &lt;strong&gt;GetDataSources&lt;/strong&gt;. Questo metodo restituisce una DataTable che contiene varie informazioni accessibili tramite le colonne "&lt;u&gt;ServerName&lt;/u&gt;", "&lt;u&gt;Instance Name&lt;/u&gt;", "&lt;u&gt;IsClustered&lt;/u&gt;", "&lt;u&gt;Version&lt;/u&gt;".&lt;/p&gt;  &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="41" alt="2008-03-11_023124" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/angellaa/WindowsLiveWriter/70526Gestionedelleconnessionietransazion_18CF/20080311_023124_1.jpg" width="568" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;Proteggere l'accesso alle stringhe di connessione&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Memorizzare informazioni sensibili con testo in chiaro non è consigliato per ovvi motivi di sicurezza.    &lt;br /&gt;Generalmente le informazioni relative alla stringa di connessione al database vengono memorizzate nel file di configurazione dell'applicazione (&lt;strong&gt;app.config&lt;/strong&gt;):&lt;/p&gt;  &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="83" alt="2008-03-11_023930" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/angellaa/WindowsLiveWriter/70526Gestionedelleconnessionietransazion_18CF/20080311_023930_1.jpg" width="814" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;Il metodo utilizzato per rendere più sicuro il file di configurazione è cifrare le sezioni che contengono informazioni sensibili.    &lt;br /&gt;Ecco lo spezzone di codice necessario per cifrare il contenuto della sezione connectionStrings all'interno del file di configurazione:     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="213" alt="2008-03-11_221620" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/angellaa/WindowsLiveWriter/70526Gestionedelleconnessionietransazion_18CF/2008-03-11_221620_5.jpg" width="702" border="0" /&gt;  &lt;/p&gt;  &lt;p&gt;e quello per decifrarne il contenuto:    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="167" alt="2008-03-11_221627" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/angellaa/WindowsLiveWriter/70526Gestionedelleconnessionietransazion_18CF/2008-03-11_221627_3.jpg" width="690" border="0" /&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/angellaa/aggbug/91648.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Angella</dc:creator>
            <guid>http://blogs.ugidotnet.org/angellaa/archive/2008/03/11/91648.aspx</guid>
            <pubDate>Tue, 11 Mar 2008 22:29:41 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/angellaa/archive/2008/03/11/91648.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/angellaa/comments/commentRss/91648.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/angellaa/services/trackbacks/91648.aspx</trackback:ping>
        </item>
        <item>
            <title>[70-526] - Gestione degli eventi</title>
            <link>http://blogs.ugidotnet.org/angellaa/archive/2008/02/27/91378.aspx</link>
            <description>&lt;p&gt;&lt;strong&gt;&lt;br /&gt;Area di riferimento&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;- Creating a UI for a Windows Forms Applications by Using Standard Controls&lt;br /&gt;    - Create event handlers for Windows Forms and controls&lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;hr /&gt;  &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;Gesione degli eventi&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Una volta selezionato un controllo sulla form, attraverso la Properties Windows è possibile visualizzare tutti gli eventi a cui questo controllo può rispondere (simbolo di un flash giallo).&lt;br /&gt;Un doppio click su un particolare evento comporta l'inserimento automatico di un gestore per quell'evento da parte dell'ambiente di sviluppo.&lt;/p&gt; &lt;p&gt;I principali eventi eventi sollevati dai controlli sono:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Click&lt;/strong&gt;  &lt;/li&gt;&lt;li&gt;&lt;strong&gt;DoubleClick&lt;/strong&gt;  &lt;/li&gt;&lt;li&gt;&lt;strong&gt;KeyDown&lt;/strong&gt;, &lt;strong&gt;KeyPress&lt;/strong&gt;, &lt;strong&gt;KeyUp&lt;/strong&gt; per gli eventi della tastiera  &lt;/li&gt;&lt;li&gt;&lt;strong&gt;MouseClick&lt;/strong&gt;,  &lt;/li&gt;&lt;li&gt;&lt;strong&gt;MouseDoubleClick&lt;/strong&gt;  &lt;/li&gt;&lt;li&gt;&lt;strong&gt;MoudeDown&lt;/strong&gt;  &lt;/li&gt;&lt;li&gt;&lt;strong&gt;MouseEnter&lt;/strong&gt;: sollevato quando il puntatore del mouse entra all'interno di un controllo  &lt;/li&gt;&lt;li&gt;&lt;strong&gt;MouseHover&lt;/strong&gt;: sollevato quando il puntatore resta sul controllo  &lt;/li&gt;&lt;li&gt;&lt;strong&gt;MouseLeave&lt;/strong&gt;: sollevato quando il puntatore esce dal controllo  &lt;/li&gt;&lt;li&gt;&lt;strong&gt;MouseMove&lt;/strong&gt;: sollevato quando il mouse viene mosso sul controllo  &lt;/li&gt;&lt;li&gt;&lt;strong&gt;MouseUp&lt;/strong&gt;: sollevato quando un pulsante del mouse è rilasciato sul controllo  &lt;/li&gt;&lt;li&gt;&lt;strong&gt;MouseWheel&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Vediamo alcuni esempi di gestori di questi eventi:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;private void button1_Click(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;    &lt;font color="#008000"&gt;// Codice relativo al click del pulsante&lt;br /&gt;&lt;/font&gt;}&lt;/strong&gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;private void textBox1_KeyPress(object sender, &lt;font color="#ff0000"&gt;KeyPressEventArgs e&lt;/font&gt;)&lt;br /&gt;{&lt;br /&gt;    &lt;font color="#008000"&gt;// Leggo il carattere digitato dall'utente&lt;/font&gt;&lt;br /&gt;    char c = &lt;font color="#ff0000"&gt;e.KeyChar&lt;/font&gt;; &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;    &lt;font color="#008000"&gt;// Se è un numero impedisco la sua visualizzazione&lt;/font&gt;&lt;br /&gt;    if (Char.IsDigit(c))&lt;br /&gt;    {&lt;br /&gt;        &lt;font color="#ff0000"&gt;e.Handled = true;&lt;/font&gt;  &lt;br /&gt;    }&lt;br /&gt;}&lt;/strong&gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;private void panel1_MouseMove(object sender, &lt;font color="#ff0000"&gt;MouseEventArgs e&lt;/font&gt;)&lt;br /&gt;{&lt;br /&gt;    &lt;font color="#008000"&gt;// Leggo le coordinate del mouse relative al controllo&lt;/font&gt;&lt;br /&gt;    int x = &lt;font color="#ff0000"&gt;e.X&lt;/font&gt;;&lt;br /&gt;    int y = &lt;font color="#ff0000"&gt;e.Y&lt;/font&gt;; &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;    if (&lt;font color="#ff0000"&gt;e.Button == MouseButtons.Left&lt;/font&gt;)&lt;br /&gt;    {&lt;br /&gt;&lt;font color="#008000"&gt;        // Hai premuto il tasto sinistro&lt;br /&gt;&lt;/font&gt;    }&lt;br /&gt;    else if (&lt;font color="#ff0000"&gt;e.Button == MouseButtons.Right&lt;/font&gt;)&lt;br /&gt;    {&lt;br /&gt;        &lt;font color="#008000"&gt;// Hai premuto il tasto destro&lt;/font&gt;&lt;br /&gt;    }&lt;br /&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;br /&gt;E' facile aggiungere e rimuovere event handler a run time utilizzando gli operatori += e -= sull'evento esposto dal controllo. E' possibile anche connettere più eventi a un singolo gestore di evento. In questo caso il gestore dell'evento deve utilizzare l'oggetto sender per sapere qual è il controllo che ha sollevato l'evento.  &lt;/p&gt;&lt;blockquote&gt; &lt;p&gt;&lt;br /&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;this.button1.Click += new System.EventHandler(this.button_Click);&lt;br /&gt;this.button2.Click += new System.EventHandler(this.button_Click);&lt;br /&gt;this.button3.Click += new System.EventHandler(this.button_Click);&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;private void button_Click(&lt;font color="#ff0000"&gt;object sender&lt;/font&gt;, EventArgs e)&lt;br /&gt;{&lt;br /&gt;   &lt;font color="#ff0000"&gt;Button btn = (Button)sender;&lt;/font&gt; &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;    if (&lt;font color="#ff0000"&gt;btn == button1&lt;/font&gt;)&lt;br /&gt;    {&lt;br /&gt;        MessageBox.Show("Button1");&lt;br /&gt;    }&lt;br /&gt;    else if (&lt;font color="#ff0000"&gt;btn == button2&lt;/font&gt;)&lt;br /&gt;    {&lt;br /&gt;        MessageBox.Show("Button2");&lt;br /&gt;    }&lt;br /&gt;    else if (&lt;font color="#ff0000"&gt;btn == button3&lt;/font&gt;)&lt;br /&gt;    {&lt;br /&gt;        MessageBox.Show("Button3");&lt;br /&gt;    }&lt;br /&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.ugidotnet.org/angellaa/aggbug/91378.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Angella</dc:creator>
            <guid>http://blogs.ugidotnet.org/angellaa/archive/2008/02/27/91378.aspx</guid>
            <pubDate>Wed, 27 Feb 2008 01:34:39 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/angellaa/archive/2008/02/27/91378.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/angellaa/comments/commentRss/91378.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/angellaa/services/trackbacks/91378.aspx</trackback:ping>
        </item>
        <item>
            <title>[70-526] - Controls and Menus</title>
            <link>http://blogs.ugidotnet.org/angellaa/archive/2008/02/27/91377.aspx</link>
            <description>&lt;p&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;Area di riferimento&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;- Creating a UI for a Windows Forms Applications by Using Standard Controls&lt;br /&gt;    - Manage control layout on a Windows Form&lt;br /&gt;        - Group and arrange controls by using the Panel Control, GroupBox control, TabControl, FlowLayoutPanel control and TableLayoutPanel control&lt;br /&gt;        - Use the SplitContainer control to create dynamic container areas&lt;br /&gt;    - Add and configure a Windows Forms control&lt;br /&gt;    - Create and configure menus&lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;hr /&gt;  &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;Controls&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Utilizzare la Toolbox (View -&amp;gt; Toolbox) per inserire sulla form dei controlli è una operazione molto semplice e non richiede particolari spiegazioni. Altrettanto semplice è utilizzare la finestra delle Properties (View -&amp;gt; Properties WIndows) per cambiere le proprietà dei controlli come colori, font, posizione, dimensioni ecc.&lt;/p&gt; &lt;p&gt;I controlli più utilizzati sono &lt;strong&gt;Button&lt;/strong&gt;, &lt;strong&gt;CheckBox&lt;/strong&gt;, &lt;strong&gt;CheckedListBox&lt;/strong&gt;, &lt;strong&gt;ComboBox&lt;/strong&gt;, &lt;strong&gt;DateTimePicker&lt;/strong&gt;, &lt;strong&gt;Label&lt;/strong&gt;, &lt;strong&gt;ListBox&lt;/strong&gt;, &lt;strong&gt;ListView&lt;/strong&gt;, &lt;strong&gt;NumericUpDown&lt;/strong&gt;, &lt;strong&gt;PictureBox&lt;/strong&gt;, &lt;strong&gt;ProgressBar&lt;/strong&gt;, &lt;strong&gt;RadioButton&lt;/strong&gt;, &lt;strong&gt;TextBox&lt;/strong&gt;. Per una descrizione dettagliata delle loro proprietà principali guardare la documentazione msdn.&lt;br /&gt;&lt;br /&gt;I controlli &lt;strong&gt;Panel&lt;/strong&gt;, &lt;strong&gt;GroupBox&lt;/strong&gt;, &lt;strong&gt;TabControl&lt;/strong&gt;, &lt;strong&gt;FlowLayoutPanel&lt;/strong&gt;, &lt;strong&gt;TableLayoutPanel&lt;/strong&gt; sono dei controlli contenitore che permettono di contenere al loro interno altri controlli. Il loro utilizzo in fase di progettazione è molto semplice. Per aggiungere un controllo al loro interno basta effettuare semplici operazioni di drag and drop. Tutti questi oggetti hanno una collection Controls a cui è possibile accedere per inserire o rimuovere dinamicamente controlli.&lt;/p&gt; &lt;p&gt;Particolarmente comode sono le proprietà &lt;strong&gt;Anchor&lt;/strong&gt; e &lt;strong&gt;Dock&lt;/strong&gt; che dettano il comportamento che deve avere un controllo rispetto al controllo parent. Impostare queste proprietà permette il ridimensionamento automatico dei controlli al ridimensionamento della form da parte dell'utente. La proprietà Dock fa in modo che il controllo si espanda per occupare tutta la regione del controllo parent. La proprietà anchor invece permette di specificare il mantenimento automatico della distanza da un lato del controllo al corrispondente lato del parent.&lt;/p&gt; &lt;p&gt;Il controllo &lt;strong&gt;SplitContainer&lt;/strong&gt; permette di creare delle sottosezioni della form dove uno Splitter divide lo SplitContainer in due controlli &lt;strong&gt;SplitterPanel&lt;/strong&gt; che si comportano in modo simile al controllo Panel. La proprietà Orientation permette di impostare se lo Splitter deve essere orizzontale o verticale.&lt;/p&gt; &lt;p&gt;Non spreco molto tempo nell'elencare le proprietà di tutti i possibili controlli perchè ritengo che il modo più rapido per conoscerli è fare delle prove direttamente con lo strumento di sviluppo Visual Studio e analizzare il codice autogenerato.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;Best Practices per la progettazione di intefacce utente&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Le principali considerazinoi per la progettazione dell'interfaccia utente sono:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Semplicità&lt;/strong&gt;  &lt;ul&gt; &lt;li&gt;Una interfaccia complessa è difficile da imparare e ciò comporta una perdita di produttività  &lt;/li&gt;&lt;li&gt;Impostare i valori di default nei controlli al valore più comune per l'utente&lt;/li&gt;&lt;/ul&gt; &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Posizione dei controlli&lt;/strong&gt;  &lt;ul&gt; &lt;li&gt;La posizione dei controlli sulla interfaccia utente dovrebbe riflettere la loro relativa importanza e frequenza di uso  &lt;/li&gt;&lt;li&gt;I controlli che visualizzano dati correlati dovrebbero essere raggruppati insieme sulla form (usare i container)&lt;/li&gt;&lt;/ul&gt; &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Consistenza&lt;/strong&gt;  &lt;ul&gt; &lt;li&gt;Una interfaccia utente deve esibire una progettazione consistente attraverso le varie form dell'applicazione  &lt;/li&gt;&lt;li&gt;La consistenza è creata dall'uso di colori, font, dimensioni e tipi dei controlli&lt;/li&gt;&lt;/ul&gt; &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Estetica&lt;/strong&gt;  &lt;ul&gt; &lt;li&gt;Quando possibile una interfaccia utente dovrebbe essere invitante e piacevole  &lt;/li&gt;&lt;li&gt;La semplicità e la chiarezza non devono mai essere sacrificate per la bellezza grafica  &lt;/li&gt;&lt;li&gt;Mai affidarsi al colore per trasmettere informazioni  &lt;/li&gt;&lt;li&gt;Evitare font che sono difficili da leggere (Usare font come Times New Roman o Arial)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;Menu&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;La creazione di Menu mediante l'utilizzo di Visual Studio è veramente semplice. Basta semplicemente inserire il componente &lt;strong&gt;MenuStrip&lt;/strong&gt; e poi lavorare direttamente sul menu per inserire le varie voci e sottovoci. Un doppio click su ciascuna di esse permette di specificare il codice associato al click da parte dell'utente. Per aggiungere o rimuovere dinamicamente menu è possibile accedere alla collection &lt;strong&gt;Items&lt;/strong&gt; di MenuStrip e alla collection &lt;strong&gt;DropDownItems&lt;/strong&gt; per l'oggetto ToolStripMenuItem.&lt;/p&gt; &lt;p&gt;Il componente &lt;strong&gt;ContexMenuStrip&lt;/strong&gt; permette di definire un menu che sarà visualizzato quando l'utente cliccherà con il tasto destro su un particolare controllo. Affinchè questo succeda basterà assegnare alla proprietà &lt;strong&gt;ContextMenu&lt;/strong&gt; del controllo il riferimento al componente ContexMenuStrip creato. Visual Studio permette di realizzare tutto ciò in modo completamente visuale !&lt;/p&gt; &lt;p&gt;Per assegnare access keys per l'accesso alle varie voci di menu basta utilizzare il carattere &amp;amp; prima della lettera desiderata mentre per impostare shortcut keys basta impostare la proprietà ShortcutKeys.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/angellaa/aggbug/91377.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Angella</dc:creator>
            <guid>http://blogs.ugidotnet.org/angellaa/archive/2008/02/27/91377.aspx</guid>
            <pubDate>Wed, 27 Feb 2008 00:59:14 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/angellaa/archive/2008/02/27/91377.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/angellaa/comments/commentRss/91377.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/angellaa/services/trackbacks/91377.aspx</trackback:ping>
        </item>
        <item>
            <title>[70-526] - Windows Forms</title>
            <link>http://blogs.ugidotnet.org/angellaa/archive/2008/02/26/91374.aspx</link>
            <description>&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Area di riferimento&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;- Creating a UI for a Windows Forms Applications by Using Standard Controls&lt;br /&gt;    -  Add and configure a Windows Form&lt;br /&gt;        -  Add a Windows Form to a project at design time&lt;br /&gt;        -  Configure a Windows Form to control accessibility, appearance, behavior, configuration, data, design, focus, layout, style and other functionality&lt;/p&gt; &lt;hr /&gt;  &lt;p&gt;&lt;br /&gt;&lt;strong&gt;Windows Forms&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Visual Studio 2005 permette di creare semplicemente un progetto Windows Forms mediante il &lt;strong&gt;template "Windows Application"&lt;/strong&gt;. Una Form è una classe che deriva dalla classe &lt;strong&gt;System.Windows.Forms.Form&lt;/strong&gt; e rappresenta una finestra di Windows. Il codice generato da Visual Studio che istanzia la form e avvia l'applicazione è il seguente:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;static class Program&lt;br /&gt;{&lt;br /&gt;    [STAThread]&lt;br /&gt;    static void Main()&lt;br /&gt;    {&lt;br /&gt;        Application.EnableVisualStyles();&lt;br /&gt;        Application.SetCompatibleTextRenderingDefault(false);&lt;br /&gt;        &lt;/strong&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;Application.Run(new Form1());&lt;br /&gt;&lt;/font&gt;    }&lt;br /&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;br /&gt;Vediamo le proprietà più importanti di una windows form:  &lt;/p&gt;&lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;// Nome della form&lt;br /&gt;&lt;/font&gt;this.Name = "Form1"; &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;// Colore di sfondo della form&lt;/font&gt;&lt;br /&gt;this.BackColor = System.Drawing.Color.FromArgb(255, 255, 192); &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;// Colore del testo nella form&lt;/font&gt;&lt;br /&gt;this.ForeColor = System.Drawing.Color.Blue; &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;// Immagine di sfondo della form e come l'immagine deve essere visualizzata&lt;br /&gt;&lt;/font&gt;this.BackgroundImage = global::Prova.Properties.Resources.foto_panorami_342;&lt;br /&gt;this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;// Pulsante predefinito della form (Click con Invio)&lt;br /&gt;&lt;/font&gt;this.AcceptButton = this.button1; &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;// Dimensioni della Form&lt;/font&gt;&lt;br /&gt;this.ClientSize = new System.Drawing.Size(394, 274); &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;// Imposta se la form è attiva o meno&lt;br /&gt;&lt;/font&gt;this.Enabled = true; &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;// Font utilizzato dai controlli della form&lt;/font&gt;&lt;br /&gt;this.Font = new System.Drawing.Font("Verdana", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;// Stile del bordo della form&lt;br /&gt;&lt;/font&gt;this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;// Icona da visualizzare sulla form&lt;/font&gt;&lt;br /&gt;this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;// Margini della form&lt;br /&gt;&lt;/font&gt;this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;// Se visualizzare il pulsante Ingradisci in alto a destra nella form&lt;br /&gt;&lt;/font&gt;this.MaximizeBox = false; &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;// Se visualizzare il pulsante di riduzione a icona&lt;br /&gt;&lt;/font&gt;this.MinimizeBox = false; &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;// Dimensioni massime e minime della form&lt;/font&gt;&lt;br /&gt;this.MaximumSize = new System.Drawing.Size(800, 600);&lt;br /&gt;this.MinimumSize = new System.Drawing.Size(400, 300); &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;// Opacità della form&lt;br /&gt;&lt;/font&gt;this.Opacity = 0.8;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;// Imposta la visibilità della form&lt;/font&gt;&lt;br /&gt;this.Visible = true; &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;// Posizione iniziale della form&lt;br /&gt;&lt;/font&gt;this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;// Testo da visualizzare sulla barra del titolo&lt;br /&gt;&lt;/font&gt;this.Text = "Una Windows Form"; &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;// Stato in cui la form si presenta la prima volta&lt;/font&gt;&lt;br /&gt;this.WindowState = System.Windows.Forms.FormWindowState.Normal; &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;// Aggiunta di controlli alla form&lt;br /&gt;&lt;/font&gt;this.Controls.Add(this.button1);&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;br /&gt;E' possibile impostare tutte queste proprietà utilizzando la finestra Properties dell'editor (premere F4 per visualizzarla). Sarà Visual Studio a creare tutto il codice necessario all'interno del metodo &lt;strong&gt;InitializeComponent&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;E' ovviamente possibile avere all'interno del progetto più classi che definiscono form. In questo caso è necessario specificare la form di startup cioè la form che sarà caricata ed eseguita per prima dall'applicazione. Per fare questo basterà modificare opportunamente il codice all'interno del metodo Main mostrato precedentemente.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Windows Forms non rettangolari&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;E' possibile creare form non rettangolari impostando la proprietà Region della form nell'event handler Form_Load. Ecco un esempio di form a forma di ellisse:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;public partial class Form1 : Form&lt;br /&gt;{&lt;br /&gt;    private void &lt;font color="#ff0000"&gt;Form1_Load&lt;/font&gt;(object sender, EventArgs e)&lt;br /&gt;    {&lt;br /&gt;        GraphicsPath gp = new GraphicsPath();&lt;br /&gt;        gp.AddEllipse(0, 0, this.Width, this.Height);&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;br /&gt;        &lt;font color="#ff0000"&gt;this.Region = new Region(gp);&lt;br /&gt;&lt;/font&gt;    } &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;    ...&lt;/strong&gt;&lt;/font&gt;  &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.ugidotnet.org/angellaa/aggbug/91374.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Angella</dc:creator>
            <guid>http://blogs.ugidotnet.org/angellaa/archive/2008/02/26/91374.aspx</guid>
            <pubDate>Tue, 26 Feb 2008 23:38:08 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/angellaa/archive/2008/02/26/91374.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/angellaa/comments/commentRss/91374.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/angellaa/services/trackbacks/91374.aspx</trackback:ping>
        </item>
        <item>
            <title>Prepararsi all'esame 70-526 - Windows-Based Client Development</title>
            <link>http://blogs.ugidotnet.org/angellaa/archive/2008/02/26/91370.aspx</link>
            <description>&lt;p&gt;&lt;br /&gt;L'esame &lt;strong&gt;70-526 Microsoft .NET Framework 2.0 - Windows-Based Client Development&lt;/strong&gt; è il passo necessario per conquistare la seguente certificazione Microsoft: &lt;br /&gt;&lt;strong&gt;Microsoft Certified Technology Specialist: .NET Framework 2.0 Windows Applications&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Ho deciso di pubblicare una serie di post espressamente dedicati per la preparazione a questo esame, senza la presunzione di essere esaustivo.&lt;br /&gt;Le motivazioni di questa scelta sono le stesse della serie di post che ho realizzato per la preparazione all'esame 70-536:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;stimolare la mia preparazione perchè per evitare di scrivere fesserie sono obbligato ad analizzare meglio quello che studio  &lt;/li&gt;&lt;li&gt;rendere disponibile altro materiale utile alla community (almeno spero)  &lt;/li&gt;&lt;li&gt;ricevere commenti costruttivi o correzioni da parte degli altri utenti più esperti di me&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Microsoft fornisce una pagina web dedicata all'esame raggiungibile al seguente indirizzo &lt;a href="http://www.microsoft.com/learning/exams/70-526.mspx"&gt;http://www.microsoft.com/learning/exams/70-526.mspx&lt;/a&gt;&lt;br /&gt;Questa pagina contiene tutte le informazioni necessarie per prepararsi all'esame nonchè un elenco estremamente dettagliato di tutte le capacità richieste per il suo superamento.  &lt;/p&gt;&lt;p&gt;Di seguito riporto solamente le aree in cui sono raggruppate le capacità richieste:  &lt;/p&gt;&lt;ol&gt; &lt;li&gt;Creating a UI for a Windows Forms Application by Using Standard Controls (15 percent)  &lt;/li&gt;&lt;li&gt;Integrating Data in a Windows Forms Application  &lt;/li&gt;&lt;li&gt;Implementing Printing and Reporting Functionality in a Windows Forms Application  &lt;/li&gt;&lt;li&gt;Enhancing Usability  &lt;/li&gt;&lt;li&gt;Implementing Asynchronous Programming Techniques to Improve the User Experience  &lt;/li&gt;&lt;li&gt;Developing Windows Forms Controls  &lt;/li&gt;&lt;li&gt;Configuring and Deploying Applications&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;In ciascun post che pubblicherò metterò sempre un riferimento all'area a cui appartiene.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/angellaa/aggbug/91370.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Angella</dc:creator>
            <guid>http://blogs.ugidotnet.org/angellaa/archive/2008/02/26/91370.aspx</guid>
            <pubDate>Tue, 26 Feb 2008 21:27:56 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/angellaa/archive/2008/02/26/91370.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/angellaa/comments/commentRss/91370.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/angellaa/services/trackbacks/91370.aspx</trackback:ping>
        </item>
    </channel>
</rss>