<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>MCAD</title>
        <link>http://blogs.ugidotnet.org/idamiani/category/MCAD.aspx</link>
        <description>Post specifici sulla preparazione alla certificazione MCAD: materiale, codice C#, commenti</description>
        <language>it-IT</language>
        <copyright>Igor Damiani</copyright>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>Da oggi sono ufficialmente l'MCP #3502269!!</title>
            <link>http://blogs.ugidotnet.org/idamiani/archive/2005/11/26/30571.aspx</link>
            <description>&lt;FONT face=Verdana size=2&gt;
&lt;P&gt;Ieri sera, con molta sorpresa, ho ricevuto il mio &lt;STRONG&gt;Welcome 
Kit&lt;/STRONG&gt; per essere diventato MCP! &lt;IMG height=19 src="http://www.imhoproject.org/files/risate.gif" width=19 align=absMiddle border=0&gt;&amp;nbsp;Sono molto contento, ho subito infilato la mia 
wallet card nel portafoglio e, giusto per fare il figo, la farò vedere a 
chiunque mi passi sotto il naso! &lt;IMG height=19 src="http://www.imhoproject.org/files/allegro.gif" width=19 align=absMiddle border=0&gt;&lt;/P&gt;
&lt;P&gt;&lt;IMG alt="" hspace=0 src="http://www.igordamiani.it/blog/mcpfoto.jpg" align=baseline border=0&gt;&lt;/P&gt;
&lt;P&gt;So che molti di voi magari essere &lt;STRONG&gt;MCP&lt;/STRONG&gt; non è nulla, però per 
me è fonte di soddisfazione. In attesa, quando le acque si saranno calmate, di 
ricominciare a studiare per sostenere gli altri esami. Continuo a ricevere 
tutt'oggi molti commenti sui miei &lt;A title="" href="http://blogs.ugidotnet.org/idamiani/category/1246.aspx" target=_new name=""&gt;post relativi ad MCAD&lt;/A&gt; scritti durante il periodo di preparazione. 
Volevo ringraziare pubblicamente, senza fare nomi e cognomi, tutti quelli che mi 
fanno i complimenti per il lavoro che ho fatto. Per me è una gioia 
indescrivibile scoprire di essere stato di aiuto a qualcuno, nel mio piccolo. 
Molti mi scrivono dicendo che hanno superato l'esame 70-316 proprio usando i 
miei post come preparazione. Ripeto, sono molto contento e non nascondo un certo 
orgoglio. &lt;IMG height=19 src="http://www.imhoproject.org/files/allegro.gif" width=19 align=absMiddle border=0&gt;&lt;/P&gt;

&lt;/FONT&gt;
&lt;FONT face=Verdana size=2&gt;&lt;P&gt;&lt;A href="http://imhoproject.org/"&gt;&lt;FONT face=Verdana size=1&gt;powered by IMHO 1.3&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;!-- Powered by IMHO 1.3 (IT) Instant Blogger Copyright (c) 2005 A.Boschin - http://www.imhoproject.org --&gt;
&lt;img src="http://blogs.ugidotnet.org/idamiani/aggbug/30571.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Igor Damiani</dc:creator>
            <guid>http://blogs.ugidotnet.org/idamiani/archive/2005/11/26/30571.aspx</guid>
            <pubDate>Sat, 26 Nov 2005 13:25:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/idamiani/archive/2005/11/26/30571.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/idamiani/comments/commentRss/30571.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/idamiani/services/trackbacks/30571.aspx</trackback:ping>
        </item>
        <item>
            <title>MCAD: la grande saga, to be continued?</title>
            <link>http://blogs.ugidotnet.org/idamiani/archive/2005/10/24/28595.aspx</link>
            <description>&lt;FONT face=Verdana size=2&gt;
&lt;P&gt;Dopo avervi annoiato con ben 49 post relativi a MCAD, 
dopo aver superato l'esame 70-316, adesso per me è tempo di ricominciare 
daccapo. No, no, state tranquilli, non ho intenzione di ripartire con [MCAD.1] 
&lt;IMG height=19 src="http://www.imhoproject.org/files/risate.gif" width=19 align=absMiddle border=0&gt;&amp;nbsp;(ma quasi quasi...), quanto piuttosto 
quello di considerare il prossimo esame da fare, e quindi di ricominciare a 
studiare.&lt;/P&gt;
&lt;P&gt;Dato che punto a MCAD, le strade possibili sono fondamentalmente 
&lt;STRONG&gt;tre&lt;/STRONG&gt;. In ordine di preferenza personale crescente, ecco gli 
esami che sto valutando.&lt;/P&gt;
&lt;OL&gt;
  &lt;LI&gt;&lt;FONT color=green&gt;Designing and Implementing Databases with Microsoft SQL 
  Server™ 2000 Enterprise Edition (70-229) &lt;/FONT&gt;&lt;FONT color=#000000&gt;- Di certo 
  non mi metto a studiare SQL Server 2000 adesso che sta uscendo il 2005. 
  Sarebbe una pazzia.&lt;BR&gt;&lt;/FONT&gt;&lt;/LI&gt;
  &lt;LI&gt;&lt;FONT color=green&gt;Developing and Implementing Web Applications with 
  Microsoft Visual C#™ .NET and Microsoft Visual Studio .NET (70-315) &lt;/FONT&gt;- 
  L'esame che preferisco di meno: ormai io con il Web c'entro poco o nulla. &lt;IMG   height=19   src="http://www.imhoproject.org/files/allegro.gif"   width=19 align=absMiddle border=0&gt;&amp;nbsp;Anche se ogni tanto sogno di fare 
  qualcosa in ambito Web, ho più la testa e la concezione delle applicazioni per 
  Windows classiche&lt;BR&gt;&lt;/LI&gt;
  &lt;LI&gt;&lt;FONT color=green&gt;Developing XML Web Services and Server Components with 
  Microsoft Visual C# and the Microsoft .NET Framework (70-320)&lt;/FONT&gt; - Questo 
  è quello che mi ispira di più. Mi sembra più coerente con quello che mi serve 
  nel mio lavoro di sviluppatore, mi sembra più "tosto", più utile e quello che, 
  a lungo andare, rende meglio.&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Quindi, optando per il &lt;STRONG&gt;70-320&lt;/STRONG&gt;, sto cercando in giro 
informazioni, tipo una &lt;STRONG&gt;Study Guide&lt;/STRONG&gt; da approfondire sulla base 
di quello che ho fatto con quella di &lt;A title="" href="http://blogs.ugidotnet.org/lbarbieri" target=_new name=""&gt;Lorenzo&lt;/A&gt; 
ottenibile da &lt;A title="" href="http://www.cramsession.com/" target=_new name=""&gt;cramsession.com&lt;/A&gt;. La cerco sia freeware, sia a pagamento: fino ad 
oggi, le ricerche sono un po' state vane, se non una pagina Web sul sito 
Microsoft di cui adesso non ho l'URL. Mi sembra un po' scarna, quindi cerco di 
meglio. Ieri in SMAU ho provato a dare un'occhiata a qualche libro che mi 
potesse dare qualche input, ma nulla da fare. Da buon ignorante, non ho nemmeno 
chiesto a qualcuno di UGI, che magari mi avrebbe consigliato qualcosa.&lt;/P&gt;
&lt;P&gt;Beh, adesso seguo il consiglio di &lt;A title="" href="http://blogs.ugidotnet.org/corrado/" target=_new name=""&gt;Corrado&lt;/A&gt;: 
lavoro, poi vi farò sapere qualcosa! &lt;IMG height=19 src="http://www.imhoproject.org/files/risate.gif" width=19 align=absMiddle border=0&gt;&lt;/P&gt;
&lt;/FONT&gt;
&lt;FONT face=Verdana size=2&gt;&lt;P&gt;&lt;A href="http://imhoproject.org/"&gt;&lt;FONT face=Verdana size=1&gt;powered by IMHO 1.2&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;!-- Powered by IMHO Instant Blogger Copyright (c) 2004 A.Boschin - http://www.elite.boschin.it --&gt;
&lt;img src="http://blogs.ugidotnet.org/idamiani/aggbug/28595.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Igor Damiani</dc:creator>
            <guid>http://blogs.ugidotnet.org/idamiani/archive/2005/10/24/28595.aspx</guid>
            <pubDate>Mon, 24 Oct 2005 12:49:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/idamiani/archive/2005/10/24/28595.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/idamiani/comments/commentRss/28595.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/idamiani/services/trackbacks/28595.aspx</trackback:ping>
        </item>
        <item>
            <title>[MCAD.49] Il giorno del fatidico esame 70-316</title>
            <link>http://blogs.ugidotnet.org/idamiani/archive/2005/10/20/28342.aspx</link>
            <description>&lt;FONT face=Verdana size=2&gt;
&lt;P&gt;Dopo&amp;nbsp;quasi 50&amp;nbsp;post effettivi sul mio blog per 
la preparazione all'esame 70-316, questa mattina, finalmente, sono andato alla 
Global Knowledge Network, qui&amp;nbsp;a Milano, per sostenere finalmente l'esame. 
Dovevo essere già sul posto alle 8:30, mezz'ora prima dell'esame. La pioggia ha 
rallentato la mia andatura, ma alla fin fine sono arrivato puntuale. &lt;IMG height=19 src="http://www.imhoproject.org/files/allegro.gif" width=19 align=absMiddle border=0&gt;&lt;/P&gt;
&lt;P&gt;Entro, do la carta d'identità, firmo un foglio. Mi accompagnano davanti al 
PC, dove mi aspetta un software intitolato qualcosa tipo "&lt;EM&gt;&lt;FONT color=blue&gt;Developing and Implementing Windows-based Applications with Microsoft 
Visual C# .NET and Microsoft Visual Studio .NET&lt;/FONT&gt;&lt;/EM&gt;". Un consiglio: le 
tizie non sanno nulla del software, non sanno spiegare cosa fa e come funziona. 
Si tratta di una normale applicazione, se proprio avete voglia, provate il 
tutorial (sull'astronomia) che vi fa imparare cosa e come cliccare durante il 
test vero e proprio.&lt;/P&gt;
&lt;P&gt;Poi, cominciano le domande. Confermo tutti i consigli che sono stati dati a 
me: &lt;STRONG&gt;fate le domande una ad una&lt;/STRONG&gt;. Rispondete a tutte. Quelle più 
semplici e a quelle che considerate più difficili. Queste ultime marcatele, così 
ci potete tornare su alla fine. Consiglio anche i Transcender, che simulano 
veramente un vero esame. I Boson (che ho usato più spesso) vanno bene, ma sono 
comunque troppo semplici per i miei gusti.&lt;/P&gt;
&lt;P&gt;Nella stanza ero da solo, mi hanno dato biro e foglio. Che bello essere da 
soli: ragiono meglio se mugugno a bassa voce. Ed è quello che ho fatto. &lt;IMG height=19 src="http://www.imhoproject.org/files/allegro.gif" width=19 align=absMiddle border=0&gt;&amp;nbsp;Comunque sia, arrivo fino alla fine, 
riguardo le domande che avevo marcato. Ci ri-ragiono su, cambio la risposta se 
mi va, alla fine confermo tutto. Il momento in cui si risponde a "&lt;FONT color=blue&gt;This is the end of your exam. Are you sure?&lt;/FONT&gt;" è angoscioso! 
&lt;IMG height=19 src="http://www.imhoproject.org/files/risate.gif" width=19 align=absMiddle border=0&gt;&lt;/P&gt;
&lt;P&gt;Alla fine,&amp;nbsp;sullo schemo è apparso&amp;nbsp;"&lt;STRONG&gt;Congratulations! Your 
score is 920!&lt;/STRONG&gt;"&lt;/P&gt;
&lt;P&gt;Non ci volevo credere! Ho tirato un sospiro di sollievo. Ho fatto tutte le 
risposte esatte in 4 categorie su 7. Nelle rimanenti ho raggiunto circa l'80%. 
Nessuno mi spiegherà mai abbastanza come ho fatto ad azzeccarle 
tutte&amp;nbsp;nella&amp;nbsp;categoria&amp;nbsp;"&lt;EM&gt;&lt;FONT color=blue&gt;Configuring and 
Securing a Windows-based Application&lt;/FONT&gt;&lt;/EM&gt;". Mah! &lt;IMG height=19 src="http://www.imhoproject.org/files/allegro.gif" width=19 align=absMiddle border=0&gt;&lt;/P&gt;
&lt;P&gt;Grazie a tutti per l'incoraggiamento, per i commenti nei miei post, per 
avermi spronato, per avermi corretto o consigliato. Da oggi sono MCP! &lt;IMG height=19 src="http://www.imhoproject.org/files/risate.gif" width=19 align=absMiddle border=0&gt;&lt;/P&gt;
&lt;/FONT&gt;
&lt;FONT face=Verdana size=2&gt;&lt;P&gt;&lt;A href="http://imhoproject.org/"&gt;&lt;FONT face=Verdana size=1&gt;powered by IMHO 1.2&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;!-- Powered by IMHO Instant Blogger Copyright (c) 2004 A.Boschin - http://www.elite.boschin.it --&gt;
&lt;img src="http://blogs.ugidotnet.org/idamiani/aggbug/28342.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Igor Damiani</dc:creator>
            <guid>http://blogs.ugidotnet.org/idamiani/archive/2005/10/20/28342.aspx</guid>
            <pubDate>Thu, 20 Oct 2005 13:39:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/idamiani/archive/2005/10/20/28342.aspx#feedback</comments>
            <slash:comments>22</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/idamiani/comments/commentRss/28342.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/idamiani/services/trackbacks/28342.aspx</trackback:ping>
        </item>
        <item>
            <title>[MCAD.48] Velocemente, come creare un Control personalizzato</title>
            <link>http://blogs.ugidotnet.org/idamiani/archive/2005/10/19/28275.aspx</link>
            <description>&lt;FONT face=Verdana size=2&gt;
&lt;P&gt;Come ho già avuto modo di dire precedentemente, ci sono 
diversi argomenti che ho tralasciato nella mia serie di articoli dedicati a 
MCAD. Uno di questi, la creazione di Windows Control, lo considero piuttosto 
importante (e, come al solito, piuttosto divertente), per cui ne parleremo oggi 
in modo magari un po' superficiale, ma più che sufficiente per superare l'esame 
70-316.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Introduzione&lt;/STRONG&gt;&lt;BR&gt;Innanzitutto, cominciamo col dire che creare 
un controllo significa in altre parole implementare una classe che erediti da 
&lt;STRONG&gt;System.Windows.Forms.UserControl&lt;/STRONG&gt;. Se utilizziamo l'editor 
Visual Studio .NET, possiamo cominciare un progetto &lt;STRONG&gt;Windows Control 
Library&lt;/STRONG&gt;. L'editor ci propone in progettazione il classico Form 
Designer, ma con qualche differenza. In questo contesto non stiamo disegnando 
una WF, ma un Control, quindi non abbiamo ad esempio la&amp;nbsp;barra del titolo ed 
altre caratteristiche proprie di una WF. Possiamo posizionare controlli, 
possiamo ancorarli, possiamo scrivere codice proprio come se stessimo 
implementando una form, quindi tenendo conto tutto quello che ci siamo detti 
negli articoli passati.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=green&gt;La grande differenza è che il controllo non vive di 
natura propria, ma deve venir ospitato in qualche container&lt;/FONT&gt;&lt;/STRONG&gt;: nel 
più semplice dei casi, una Windows Form. Una volta compilato il progetto e 
generato l'assembly, possiamo aggiungerne l'icona nella ToolBox dell'IDE di 
VS.NET. Come? Abbiamo due possibilità:&lt;/P&gt;
&lt;OL&gt;
  &lt;LI&gt;Clicchiamo con il pulsante destro, poi su "Add/Remove Items...", 
  clicchiamo sul pulsante &lt;STRONG&gt;Browse&lt;/STRONG&gt; e andiamo a selezionare 
  l'assembly nella directory &lt;STRONG&gt;bin\Debug&lt;/STRONG&gt; o 
  &lt;STRONG&gt;bin\Release&lt;/STRONG&gt;
  &lt;LI&gt;Stessa procedura, ma cominciando dal menù &lt;STRONG&gt;Tools&lt;/STRONG&gt; 
  dell'IDE&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Quando&amp;nbsp;l'icona è stata aggiunta nella ToolBox, il nostro controllo è a 
nostra completa disposizione. Io personalmente ho preferito aggiungere un nuovo 
progetto Windows Application&amp;nbsp;alla soluzione corrente. In questo modo passo 
velocemente dal progetto Control al progetto che ospita il Control stesso. Più 
comodo di così! &lt;IMG height=19 src="http://www.imhoproject.org/files/allegro.gif" width=19 align=absMiddle border=0&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Property personalizzate del nostro Control&lt;/STRONG&gt;&lt;BR&gt;Come tutte le 
classi, anche i Control possiedono properties che possono influenzarne il 
comportamento. Alcune di queste properties vengono ereditate dalla classe 
&lt;STRONG&gt;UserControl&lt;/STRONG&gt;, altre ovviamente possiamo definirle 
noi a nostro piacimento in base alle necessità.&amp;nbsp;Chi sviluppa con .NET da un 
po' di tempo, può sembrare normale, ma&amp;nbsp;chi proviene da VB6, per esempio, troverà anche una 
piccola sorpresa. Mi spiego meglio.&lt;/P&gt;
&lt;P&gt;Le property personalizzate appaiono automaticamente nella Property Window nel 
progetto in cui viene ospitato il Control stesso. Non solo: l'IDE è anche 
abbastanza intelligente: se la nostra property è definibile attraverso un public 
enum, allora nella Property Window comparirà la ComboBox che ci permette di dare 
un valore alla property semplicemente scegliendola tra i possibili valori. Ad 
esempio, se il mio Control possiede una property di tipo 
&lt;STRONG&gt;DrawingModeStyle&lt;/STRONG&gt; che è un enum:&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: black 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; BORDER-LEFT: black 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: gainsboro"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;public&amp;nbsp;enum&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;DrawingModeStyle&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Happy&amp;nbsp;=&amp;nbsp;0,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Sad&amp;nbsp;=&amp;nbsp;1,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Angry&amp;nbsp;=&amp;nbsp;2&lt;BR&gt;}&lt;BR&gt;&lt;/DIV&gt;&lt;/SPAN&gt;
&lt;P&gt;Quando andrò a selezionare il Control sulla mia WF, la Property Windows 
mostrerà una cosa del genere:&lt;/P&gt;
&lt;P&gt;&lt;IMG alt="" hspace=0 src="http://www.igordamiani.it/blog/mcad_10.jpg" align=baseline border=0&gt;&lt;/P&gt;
&lt;P&gt;Chi ha partecipato al Workshop di Luglio, sa benissimo come adattare la 
Property Windows ai nostri scopi. Usando gli attributi [Category], 
[Description], [Browseable] e tanti altri, possiamo&amp;nbsp;regolare la nostra 
property &lt;STRONG&gt;DrawingMode&lt;/STRONG&gt; come vogliamo.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Disegnare un nostro Control da zero&lt;BR&gt;&lt;/STRONG&gt;Questo è il caso più 
semplice, ovvero la costruzione di un Control "complesso" che comprende più 
Control e ne estende le funzionalità. .NET ci dà la possibilità di disegnare un 
controllo completamente da zero, usando tutte le classi incluse nel namespace 
&lt;STRONG&gt;System.Drawing&lt;/STRONG&gt;. Il succo del discorso è quello di fare 
l'override dell'evento &lt;STRONG&gt;Paint&lt;/STRONG&gt; del controllo di base, e disegnare 
quello che vogliamo.&lt;/P&gt;
&lt;P&gt;Farò in tempo a parlarne meglio in un altro post? &lt;IMG height=19 src="http://www.imhoproject.org/files/allegro.gif" width=19 align=absMiddle border=0&gt;&lt;/P&gt;
&lt;/FONT&gt;
&lt;FONT face=Verdana size=2&gt;&lt;P&gt;&lt;A href="http://imhoproject.org/"&gt;&lt;FONT face=Verdana size=1&gt;powered by IMHO 1.2&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;!-- Powered by IMHO Instant Blogger Copyright (c) 2004 A.Boschin - http://www.elite.boschin.it --&gt;
&lt;img src="http://blogs.ugidotnet.org/idamiani/aggbug/28275.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Igor Damiani</dc:creator>
            <guid>http://blogs.ugidotnet.org/idamiani/archive/2005/10/19/28275.aspx</guid>
            <pubDate>Wed, 19 Oct 2005 14:22:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/idamiani/archive/2005/10/19/28275.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/idamiani/comments/commentRss/28275.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/idamiani/services/trackbacks/28275.aspx</trackback:ping>
        </item>
        <item>
            <title>[MCAD.47] Data-Binding: in mezzo fra Control e sorgente dati</title>
            <link>http://blogs.ugidotnet.org/idamiani/archive/2005/10/07/27751.aspx</link>
            <description>&lt;FONT face=Verdana size=2&gt;
&lt;P&gt;Usare il data-binding può veramente togliere gran parte del 
lavoro di scrittura del codice. In questi giorni lo sto esplorando ben bene, e 
devo dire che, sebbene ci siano molti modi diversi e sicuramente più ottimizzati 
per realizzare WF che prelevino i dati da un database, è veramente divertente 
e piacevole vedere cosa si può fare in così poco tempo. Si è sul serio 
molto più produttivi.&lt;/P&gt;
&lt;P&gt;Non mi interessa parlare di &lt;STRONG&gt;DataSource&lt;/STRONG&gt;, 
&lt;STRONG&gt;DataMember&lt;/STRONG&gt; ed affini. In parte l'ho già fatto &lt;A title="" href="http://blogs.ugidotnet.org/idamiani/archive/2005/10/05/27597.aspx" target=_new name=""&gt;nel mio post precedente&lt;/A&gt;           
, in parte vorrei invece approfondire un discorso che, ancora una 
volta, mi ha colpito positivamente. Ovvero, parlare della classe 
&lt;STRONG&gt;Binding&lt;/STRONG&gt;, che è una sorte di "ponte" che si trova&amp;nbsp;a metà 
strada tra il nostro &lt;STRONG&gt;Control&lt;/STRONG&gt; e la &lt;STRONG&gt;sorgente 
dati&lt;/STRONG&gt; sottostante. Usando la classe Binding, infatti, possiamo 
intervenire nel momento in cui .NET fa il binding vero e proprio, e giocare come 
vogliamo. Vediamo un po' più nel dettaglio cosa intendo.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Qual'è lo scopo della classe Binding? A cosa 
serve?&lt;/STRONG&gt;&lt;BR&gt;Abbiamo detto che la classe Binding è il motore nascosto che 
fa muovere tutto il data-binding delle nostre WF. Quando chiamiamo il metodo 
&lt;STRONG&gt;Add&lt;/STRONG&gt; della property &lt;STRONG&gt;DataBindings&lt;/STRONG&gt; di un 
qualsiasi controllo, in realtà creiamo implicitamente un'istanza della classe 
Binding. Possiamo poi recuperarla accedendo alla collection 
&lt;STRONG&gt;DataBindings&lt;/STRONG&gt; del relativo controllo, come ad esempio qui sotto, 
tratto da un'applicazione che sto creando proprio in questi giorni:&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: black 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; BORDER-LEFT: black 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: gainsboro"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #008000; FONT-FAMILY: Courier New"&gt;//&amp;nbsp;recupero&amp;nbsp;Binding&amp;nbsp;accedendo&amp;nbsp;alla&amp;nbsp;collection&amp;nbsp;DataBindings&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;Binding&amp;nbsp;bnd&amp;nbsp;=&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;this&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;.txtDenominazione.DataBindings["Text"];&lt;BR&gt;&lt;/DIV&gt;&lt;/SPAN&gt;
&lt;P&gt;La classe &lt;STRONG&gt;Binding&lt;/STRONG&gt; espone, tra le altre cose, di due eventi 
importanti ed utili: &lt;STRONG&gt;Format&lt;/STRONG&gt; e 
&lt;STRONG&gt;Parse&lt;/STRONG&gt;. Il Format si scatena ogni volta che 
un'informazione viene formattata su un controllo. Il Parse si scatena ogni volta 
che un'informazione viene editata sul controllo ed aggiornata nella sorgente 
dati. E' sufficiente aggiungere un delegate per questi due eventi per manipolare 
a piacimento quello che "va e che viene, da e verso la sorgente dati". Ad 
esempio, banalmente:&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: black 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; OVERFLOW: auto; BORDER-LEFT: black 1px solid; WIDTH: 607px; PADDING-TOP: 5px; BORDER-BOTTOM: black 1px solid; HEIGHT: 75px; BACKGROUND-COLOR: gainsboro"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;Binding&amp;nbsp;bnd&amp;nbsp;=&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;this&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;.txtDenominazione.DataBindings["Text"];&lt;BR&gt;bnd.Format&amp;nbsp;+=&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;new&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;ConvertEventHandler(formatta);&lt;BR&gt;.&lt;BR&gt;...&lt;BR&gt;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;private&amp;nbsp;void&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;formatta(&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;object&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;sender,&amp;nbsp;ConvertEventArgs&amp;nbsp;e)&lt;BR&gt;{&amp;nbsp;&amp;nbsp;e.Value&amp;nbsp;=&amp;nbsp;e.Value.ToString().ToUpper();&amp;nbsp;}&lt;BR&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;/SPAN&gt;Se dalla sorgente dati leggo la stringa "via giovanni pascoli, 14", 
nella mia TextBox apparirà "VIA GIOVANNI PASCOLI", proprio perchè l'evento 
&lt;STRONG&gt;Format&lt;/STRONG&gt; si frappone. In questo caso, ho messo un semplice 
&lt;STRONG&gt;ToUpper()&lt;/STRONG&gt; per convertire tutto maiuscolo: avremmo 
potuto fare qualsiasi altra cosa, nei limiti del framework (!).&amp;nbsp;Stessa cosa 
all'inverso, possiamo gestire l'evento Parse per restituire alla sorgente dati 
l'informazione come vogliamo che venga scritta nel database.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Utilizzo avanzato del 
data-binding&lt;BR&gt;&lt;/STRONG&gt;Usando questa tecnica, ho fatto una cosa più che 
divertente. &lt;IMG height=19 src="http://www.imhoproject.org/files/allegro.gif" width=19 align=absMiddle border=0&gt;&lt;BR&gt;Ho creato una piccola tabella 
&lt;STRONG&gt;ForBind&lt;/STRONG&gt; su SQL Server con un solo campo 
&lt;STRONG&gt;DimFont&lt;/STRONG&gt;&amp;nbsp;di tipo &lt;FONT color=blue&gt;int&lt;/FONT&gt;. Ho creato 
record a caso con i valori: 24, 16, 36, 6, etc. Ho cominciato un progetto WF 
nuovo, ho usato la toolbox per creare velocemente 
&lt;STRONG&gt;SqlConnection&lt;/STRONG&gt;, &lt;STRONG&gt;SqlDataAdapter&lt;/STRONG&gt; e un 
&lt;STRONG&gt;DataSet&lt;/STRONG&gt; per caricare il contenuto della 
tabella&amp;nbsp;ForBind.&lt;/P&gt;
&lt;P&gt;Poi, ho creato (via codice, questa volta), un binding su una TextBox della 
mia WF tra la property Font e il campo DimFont. Ovviamente, compilando il 
progetto ed eseguendolo, ho avuto un exception. &lt;STRONG&gt;&lt;FONT color=red&gt;E' 
importante ricordare che se faccio il binding su una property di tipo 
xyz&lt;/FONT&gt;&lt;/STRONG&gt; (int, string, Font, size e così via), &lt;STRONG&gt;&lt;FONT color=red&gt;la sorgente dati deve in qualche modo ritornare un oggetto dello 
stesso tipo.&lt;/FONT&gt;&lt;/STRONG&gt; Tenendo a mente questo, ho scritto un piccolo 
handler dell'evento &lt;STRONG&gt;Format&lt;/STRONG&gt; in questo modo:&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: black 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; BORDER-LEFT: black 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: gainsboro"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;private&amp;nbsp;void&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;formattaFont(&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;object&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;sender,&amp;nbsp;ConvertEventArgs&amp;nbsp;e)&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;int&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;dim&amp;nbsp;=&amp;nbsp;(&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;int&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;)&amp;nbsp;e.Value;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e.Value&amp;nbsp;=&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;new&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;Font("Tahoma",&amp;nbsp;dim);&lt;BR&gt;}&lt;BR&gt;&lt;/DIV&gt;&lt;/SPAN&gt;
&lt;P&gt;L'evento, come abbiamo visto, viene sollevato &lt;STRONG&gt;prima&lt;/STRONG&gt; che la 
sorgente dati comunichi con il Control. Intercettiamo la chiamata, restituiamo 
un oggetto Font. Adesso, se eseguo il progetto, la TextBox usa un Font piuttosto 
che un altro in base alla posizione del record su cui sono posizionato 
all'interno della sorgente dati (ho aggiunto due Button per sfogliare in back e 
in forward passando per il &lt;FONT size=2&gt;&lt;STRONG&gt;BindingManagerBase&lt;/STRONG&gt;&lt;/FONT&gt;).&lt;/P&gt;
&lt;P&gt;Con la property &lt;STRONG&gt;Font&lt;/STRONG&gt; magari ha poco senso: immaginatevi però 
che bello "bindare" il BackColor, o la Size o altre property che all'occasione 
posso rivelarsi utili&lt;/P&gt;
&lt;/FONT&gt;
&lt;FONT face=Verdana size=2&gt;&lt;P&gt;&lt;A href="http://imhoproject.org/"&gt;&lt;FONT face=Verdana size=1&gt;powered by IMHO 1.2&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;!-- Powered by IMHO Instant Blogger Copyright (c) 2004 A.Boschin - http://www.elite.boschin.it --&gt;
&lt;img src="http://blogs.ugidotnet.org/idamiani/aggbug/27751.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Igor Damiani</dc:creator>
            <guid>http://blogs.ugidotnet.org/idamiani/archive/2005/10/07/27751.aspx</guid>
            <pubDate>Fri, 07 Oct 2005 14:22:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/idamiani/archive/2005/10/07/27751.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/idamiani/comments/commentRss/27751.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/idamiani/services/trackbacks/27751.aspx</trackback:ping>
        </item>
        <item>
            <title>[MCAD.46] Velocemente, il data-binding</title>
            <link>http://blogs.ugidotnet.org/idamiani/archive/2005/10/05/27597.aspx</link>
            <description>&lt;FONT face=Verdana size=2&gt;
&lt;P&gt;Faccio&amp;nbsp;sempre una brutta faccia quando sento 
parlare di data-binding.&lt;BR&gt;In ambiente Visual Basic 6 ed affini, il 
data-binding&amp;nbsp;è un metodo che permette di "collegare" bidirezionalmente un 
controllo ad una sorgente dati come, tipicamente, un database. Questo 
collegamento era completamente trasparente per l'utente: era sufficiente 
posizionare un controllo Data sul form o, più recentemente, un ADODC e impostare 
qualche proprietà del controllo ed il gioco era fatto. Troppi automatismi 
rendono il vita facile, è vero, ma tolgono allo stesso tempo&amp;nbsp;controllo 
lasciando poco spazio al programmatore per intervenire nel processo che, di 
fatto, era gestito dal runtime di VB.&lt;/P&gt;
&lt;P&gt;    In ambiente .NET le cose sono&amp;nbsp;radicalmente diverse.&amp;nbsp;Data 
l'architettura disconnessa di ADO.NET, non siamo mai&amp;nbsp;veramente connessi al 
database, se non durante l'operazione di &lt;STRONG&gt;Fill&lt;/STRONG&gt; attuata dal 
SqlDataAdapter. Di conseguenza, il data-binding in .NET permette, come 
prima,&amp;nbsp;di &lt;STRONG&gt;collegare un controllo ad una sorgente dati&lt;/STRONG&gt;, ma nel 
significato più ampio e generico&amp;nbsp;del termine. Una sorgente dati infatti può 
essere una banale variabile, una classe, una collection o, nei casi più utili, 
una DataTable o un DataSet. Non solo: se prima con VB6 il controllo era legato 
alla sorgente dati tramite la proprietà stabilita a priori dal creatore del 
controllo, con .NET è tutto sotto il nostro controllo.&lt;BR&gt;  
             
         Vediamo, velocemente, come, 
cosa, perchè e quando!&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Colleghiamo una ListBox con una sorgente dati&lt;BR&gt;&lt;/STRONG&gt;Ho fatto 
una prova veloce, semplice e, meraviglia, funzionante. Ho preso una WF, ho 
posizionato una banale ListBox, ho creato un &lt;STRONG&gt;&lt;A title="" href="http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemcollectionsarraylistclasstopic.asp" target=_new name=""&gt;&lt;STRONG&gt;ArrayList&lt;/STRONG&gt;&lt;/A&gt;&lt;/STRONG&gt; con un 
po' di elementi a caso. Poi, ho legato la ListBox con l'ArrayList. Il tutto con 
una manciata di righe di codice C#:&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: black 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; BORDER-LEFT: black 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: gainsboro"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;lista&amp;nbsp;=&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;new&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;ArrayList();&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;for&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;(&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;int&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;i=1;i&amp;lt;11;i++)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lista.Add("elemento&amp;nbsp;n."&amp;nbsp;+&amp;nbsp;i);&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;this&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;.listBox1.DataSource&amp;nbsp;=&amp;nbsp;lista;&lt;BR&gt;&lt;/DIV&gt;&lt;/SPAN&gt;
&lt;P&gt;Il codice qui sopra popola l'ArrayList &lt;STRONG&gt;lista&lt;/STRONG&gt; (definito come 
&lt;FONT color=blue&gt;private&lt;/FONT&gt; della WF) con 10 stringhe. Al termine 
dell'esecuzione del&amp;nbsp;codice qui sopra, la ListBox mostra tutti gli elementi 
di &lt;STRONG&gt;lista&lt;/STRONG&gt;. Questo automatismo è fornito gratis dal framework: se 
un Control possiede le properties &lt;STRONG&gt;&lt;A title="" href="http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemwindowsformslistcontrolclassdatasourcetopic.asp" target=_new name=""&gt;&lt;STRONG&gt;DataSource&lt;/STRONG&gt;&lt;/A&gt;&lt;/STRONG&gt; e/o 
&lt;STRONG&gt;&lt;A title="" href="http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemwebuiwebcontrolslistcontrolclassdatamembertopic.asp" target=_new name=""&gt;&lt;STRONG&gt;DataMember&lt;/STRONG&gt;&lt;/A&gt;&lt;/STRONG&gt;, possiamo impostarne&amp;nbsp;la sorgente 
dati. Questo è il caso più semplice, perchè il Control è sufficientemente 
&lt;EM&gt;intelligente&lt;/EM&gt; da conoscere come mostrare i dati: se è un Control di tipo 
lista, allora semplicemente mostrerà tutti gli elementi. Così è per esempio per la ListBox o 
per la ComboBox.&lt;/P&gt;
&lt;P&gt;Se parliamo di data-binding, la &lt;A title="" href="http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemWebUIWebControlsDataGridClassTopic.asp" target=_new name=""&gt;DataGrid&lt;/A&gt; gioca un ruolo fondamentale. Essa possiede le 
properties DataSource e DataMember, per cui possiamo riempirla di dati molto 
velocemente tramite un bel DataSet riempito a dovere, tramite:&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: black 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; BORDER-LEFT: black 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: gainsboro"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;this&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;.grdGriglia.DataSource&amp;nbsp;=&amp;nbsp;dsTabella;&lt;BR&gt;&lt;/DIV&gt;&lt;/SPAN&gt;
&lt;P&gt;Nulla di più semplice. Come ben sappiamo però, un DataSet può contenere più 
di una tabella: se vogliamo mostrare direttamente il contenuto di una DataTable 
specifica, possiamo farlo agendo su &lt;STRONG&gt;DataMember&lt;/STRONG&gt;, che va 
impostato sul nome della tabella stessa. La DataGrid dispone di diverse 
caratteristiche comode, come la possibilità di ordinare i records agendo sugli 
headers della griglia.&lt;/P&gt;
&lt;P&gt;Io mi sono divertito ad impostare&amp;nbsp;un &lt;STRONG&gt;&lt;A title="" href="http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemdatadataviewclasstopic.asp" target=_new name=""&gt;&lt;STRONG&gt;DataView&lt;/STRONG&gt;&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;come 
&lt;STRONG&gt;DataSource&lt;/STRONG&gt; della griglia. Il DataView rappresenta una vista su 
una DataTable specifica. Usandolo,&amp;nbsp;ho usato&amp;nbsp;le proprietà 
&lt;STRONG&gt;Sort&lt;/STRONG&gt; e &lt;STRONG&gt;RowFilter&lt;/STRONG&gt; per riordinare la griglia 
come volevo, o per filtrarne i dati.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Fare data-binding su una 
TextBox&lt;/STRONG&gt;&lt;BR&gt;Complichiamoci la vita. La TextBox non dispone di DataSource e DataMember, 
però possiamo comunque fare binding in modo interessante utilizzando la property 
&lt;STRONG&gt;DataBindings&lt;/STRONG&gt;. Questa property è in realtà una collection di 
oggetti &lt;STRONG&gt;Binding&lt;/STRONG&gt; che consente di creare un collegamento (come 
dicevo prima) tra controllo e sorgente dati indicando: property del controllo, 
nome della sorgente ed eventuale campo della sorgente dati. Ultima nota: 
trattandosi di una TextBox, vedremo un solo elemento alla volta della sorgente 
dati. Il caso più semplice e banale (leggere &lt;EM&gt;inutile&lt;/EM&gt;) è questo:&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: black 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; BORDER-LEFT: black 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: gainsboro"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;string&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;testo&amp;nbsp;=&amp;nbsp;"pippo";&lt;BR&gt;Binding&amp;nbsp;bnd&amp;nbsp;=&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;new&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;Binding("Text",&amp;nbsp;testo,&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;null&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;);&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;this&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;.textBox1.DataBindings.Add(bnd);&lt;BR&gt;&lt;/DIV&gt;&lt;/SPAN&gt;
&lt;P&gt;Nonostante la semplicità, possiamo già dedurre una cosa importante. La 
variabile &lt;STRONG&gt;testo&lt;/STRONG&gt; può essere qualsiasi contenitore di dati, e 
&lt;STRONG&gt;null&lt;/STRONG&gt; è il nome della property del contenitore. Per esempio, ho 
creato una classe &lt;STRONG&gt;Auto&lt;/STRONG&gt; con tre proprietà: marca, modello e 
numero di porte. Ho creato una property &lt;STRONG&gt;GetCompleteName&lt;/STRONG&gt; che mi 
ritorna una string formata dalla concatenazione di marca + modello. Ho fatto un 
semplice data binding con le seguenti linee di codice:&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: black 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; BORDER-LEFT: black 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: gainsboro"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;Auto&amp;nbsp;mia&amp;nbsp;=&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;new&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;Auto("Opel",&amp;nbsp;"Astra&amp;nbsp;1.6",&amp;nbsp;4);&lt;BR&gt;Binding&amp;nbsp;bnd&amp;nbsp;=&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;new&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;Binding("Text",&amp;nbsp;mia,&amp;nbsp;"GetCompleteName");&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;this&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;.textBox1.DataBindings.Add(bnd);&lt;BR&gt;&lt;/DIV&gt;&lt;/SPAN&gt;
&lt;P&gt;Quando avvio il progetto, la TextBox contiene la string "Opel Astra 1.6". Con 
le righe qui sopra, ho collegato la property &lt;STRONG&gt;Text&lt;/STRONG&gt; della 
&lt;STRONG&gt;TextBox&lt;/STRONG&gt; con la property &lt;STRONG&gt;GetCompleteName&lt;/STRONG&gt; della 
mia classe &lt;STRONG&gt;Auto&lt;/STRONG&gt;. Attenzione che GetCompleteName deve essere 
implementata come una property (keyword &lt;STRONG&gt;get&lt;/STRONG&gt;) e non come metodo: 
il binding in quest'ultimo caso non funziona.&lt;/P&gt;
&lt;P&gt;Lasciatemi fare qualche esperimento interessante, e proseguirò sul discorso 
data-binding.&lt;BR&gt;Tutti i commenti del caso sono assolutamente graditi!!!&lt;/P&gt;
&lt;P&gt;
&lt;/FONT&gt;
&lt;FONT face=Verdana size=2&gt;&lt;A href="http://imhoproject.org/"&gt;&lt;FONT face=Verdana size=1&gt;powered by IMHO 1.2&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;!-- Powered by IMHO Instant Blogger Copyright (c) 2004 A.Boschin - http://www.elite.boschin.it --&gt;
&lt;img src="http://blogs.ugidotnet.org/idamiani/aggbug/27597.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Igor Damiani</dc:creator>
            <guid>http://blogs.ugidotnet.org/idamiani/archive/2005/10/05/27597.aspx</guid>
            <pubDate>Wed, 05 Oct 2005 16:35:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/idamiani/archive/2005/10/05/27597.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/idamiani/comments/commentRss/27597.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/idamiani/services/trackbacks/27597.aspx</trackback:ping>
        </item>
        <item>
            <title>[MCAD.45] Reindirizzare un assembly da una oldVersion ad una newVersion</title>
            <link>http://blogs.ugidotnet.org/idamiani/archive/2005/10/04/27437.aspx</link>
            <description>&lt;FONT face=Verdana size=2&gt;
&lt;P&gt;Ecco lo scenario: il vostro&amp;nbsp;collega ha sviluppato 
in C# un assembly molto carino. L'assembly si chiama 
&lt;STRONG&gt;GetBirthday.dll&lt;/STRONG&gt; e dispone di un solo metodo statico, 
&lt;STRONG&gt;GetNearestBirthday()&lt;/STRONG&gt;. L'assembly è strong-named. Il nostro 
collega l'ha installato&amp;nbsp;nella nostra GAC&amp;nbsp;con un piccolo installer 
fatto da lui. Il metodo GetNearestBirthday ritorna una string contenente il 
compleanno più vicino nel tempo fra quelli presenti in un database SQL Server 
(&lt;EM&gt;qualsiasi riferimento all'applicazione &lt;STRONG&gt;Age&lt;/STRONG&gt; è puramente 
casuale&lt;/EM&gt;).&lt;/P&gt;
&lt;P&gt;L'assembly installato in questo momento è alla versione 1.0.0.0: noi lo 
abbiamo usato&amp;nbsp;nella nostra applicazione&amp;nbsp;&lt;STRONG&gt;Age&lt;/STRONG&gt;, e gira a 
meraviglia. Clicco un pulsante, e in una TextBox mi viene detto che il prossimo 
compleanno è di mio papà!!! Me lo devo ricodare...&lt;/P&gt;
&lt;P&gt;Oggi il nostro collega ha preparato una nuova versione di 
&lt;STRONG&gt;GetBirthday.dll&lt;/STRONG&gt; (la 1.1.0.0) con un nuovo metodo (che adesso è 
OT e non ci interessa). Ci prepara un nuovo installer, che noi prontamente 
eseguiamo. Lanciamo la nostra applicazione, ed otteniamo una bella exception 
all'avvio. Aiuto, e ADESSO? Abbiamo due strade:&lt;/P&gt;
&lt;OL&gt;
  &lt;LI&gt;Chiamiamo il nostro collega, gli facciamo vedere il problema, lo copriamo 
  di insulti e nel frattempo &lt;FONT color=green&gt;noi siamo bloccati con il nostro 
  lavoro perchè l'assembly blocca tutto&lt;/FONT&gt;
  &lt;LI&gt;Chiamiamo il nostro collega, gli facciamo vedere il problema, lo copriamo 
  di insulti e nel frattempo &lt;FONT color=green&gt;continuiamo tranquillamente a 
  lavorare usando la versione precedente dell'assembly&lt;/FONT&gt;&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Siccome siamo persone civili, propendiamo per la seconda opzione. Come 
facciamo? Il giochino sta nel lavorare sui files XML che .NET utilizza per 
gestire tutto l'ambiente di runtime del CLR. Facendola breve, apriamo il file 
&lt;STRONG&gt;Age.exe.config&lt;/STRONG&gt; ed aggiungiamo il seguente blocco XML:&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: black 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; BORDER-LEFT: black 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: gainsboro"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;&amp;lt;runtime&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;assemblyBinding&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #ff0000; FONT-FAMILY: Courier New"&gt;xmlns&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;="urn:schemas-microsoft-com:asm.v1"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;dependentAssembly&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;assemblyIdentity&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #ff0000; FONT-FAMILY: Courier New"&gt;name&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;="GetBirthday"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #ff0000; FONT-FAMILY: Courier New"&gt;publicKeyToken&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;="bfe1065dc666ab20"&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #8b0000; FONT-FAMILY: Courier New"&gt;/&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;bindingRedirect&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #ff0000; FONT-FAMILY: Courier New"&gt;oldVersion&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;="1.1.0.0"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #ff0000; FONT-FAMILY: Courier New"&gt;newVersion&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;="1.0.0.0"&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #8b0000; FONT-FAMILY: Courier New"&gt;/&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #8b0000; FONT-FAMILY: Courier New"&gt;/&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;dependentAssembly&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #8b0000; FONT-FAMILY: Courier New"&gt;/&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;assemblyBinding&amp;gt;&lt;BR&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #8b0000; FONT-FAMILY: Courier New"&gt;/&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;runtime&amp;gt;&lt;BR&gt;&lt;/DIV&gt;&lt;/SPAN&gt;
&lt;P&gt;I tag &amp;lt;runtime&amp;gt;&amp;lt;/runtime&amp;gt; contengono tutte le informazioni che il 
runtime .NET userà per reindirizzare una versione di un assembly ad un altra. 
Nel nostro caso, specifichiamo che se la nostra applicazione&amp;nbsp;vuole 
usare&amp;nbsp;la versione 1.1.0.0 di GetBirthday (che è quella che ci dà errore), 
in realtà dovrà usare la 1.0.0.0 (che invece è quella che gira correttamente). 
Et voilà, il gioco è fatto!!!&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Altre informazioni&lt;BR&gt;&lt;/STRONG&gt;Da notare che questo "giochino" di 
redirect è possibile solo se l'assembly è strong-named, perchè solo questi 
assembly hanno una release. Il CLR ignora di fatto la versione di un assembly 
che &lt;STRONG&gt;non è&lt;/STRONG&gt;&amp;nbsp;strong-named.&lt;/P&gt;
&lt;P&gt;Il blocco XML indicato sopra può essere utilizzato anche nei files 
&lt;STRONG&gt;machine.config&lt;/STRONG&gt; e &lt;STRONG&gt;web.config&lt;/STRONG&gt;. Io personalmente ho avuto comunque 
qualche problema. Incollandolo nel mio machine.config, non mi partiva più IMHO (con un TypeInizializationException): perchè? In teoria IMHO 
non è nemmeno a conoscenza del mio assembly, perchè mi segnala 
questa exception?&lt;/P&gt;
&lt;/FONT&gt;
&lt;FONT face=Verdana size=2&gt;&lt;P&gt;&lt;A href="http://imhoproject.org/"&gt;&lt;FONT face=Verdana size=1&gt;powered by IMHO 1.2&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;!-- Powered by IMHO Instant Blogger Copyright (c) 2004 A.Boschin - http://www.elite.boschin.it --&gt;
&lt;img src="http://blogs.ugidotnet.org/idamiani/aggbug/27437.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Igor Damiani</dc:creator>
            <guid>http://blogs.ugidotnet.org/idamiani/archive/2005/10/04/27437.aspx</guid>
            <pubDate>Tue, 04 Oct 2005 14:01:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/idamiani/archive/2005/10/04/27437.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/idamiani/comments/commentRss/27437.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/idamiani/services/trackbacks/27437.aspx</trackback:ping>
        </item>
        <item>
            <title>[MCAD.44] Quello che secondo me ho trascurato nel mio MCAD</title>
            <link>http://blogs.ugidotnet.org/idamiani/archive/2005/10/04/27429.aspx</link>
            <description>&lt;FONT face=Verdana size=2&gt;
&lt;P&gt;Questo è il post relativo a MCAD N°44, oggi è il 4 ottobre, il primo post&amp;nbsp;è stato scritto il 4 luglio. 
Dev'essere il destino che ogni tanto fa questi giochini!! Oggi, quando uscirò 
dall'uffico, andrò nella prima ricevitoria a giocare i numeri 4 e&amp;nbsp;44, ambo 
secco. Chi lo sa, magari vinco qualcosa!!! &lt;IMG height=19 src="http://www.imhoproject.org/files/allegro.gif" width=19 align=absMiddle border=0&gt;            
            
    &lt;/P&gt;
&lt;P&gt;Tornando seri: ritengo di aver parlato della maggior parte degli argomenti inerenti l'esame 
70-316. La data dell'esame si sta avvicinando. Cosa manca? Cosa ho trascurato? 
Cosa conviene leggersi e studiarsi per bene prima di affrontare il mitico 
primo esame per diventare MCP? Un'idea ce l'ho: usando i software Boson e&amp;nbsp;provando 
anche i Transcender mi sono fatto un'idea piuttosto precisa, in base alle 
domande che mi hanno trovato spiazzato e con un'espressione sulla faccia del 
tipo: "Eeehhh??? Che diavolo è 'sta roba????".&lt;BR&gt;Vediamo di parlarne 
brevemente.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Files config&lt;/STRONG&gt;&lt;BR&gt;Parecchie domande riguardavano 
&lt;EM&gt;machine.config&lt;/EM&gt; e &lt;EM&gt;app.config&lt;/EM&gt;. Ad esempio:&lt;/P&gt;
&lt;UL&gt;
  &lt;LI&gt;come&amp;nbsp;obbligare un'applicazione ad usare un 
  assembly alla versione XYZ piuttosto che un'altra 
  &lt;LI&gt;cosa devo fare per abilitare o disabilitare il trace 
  dell'applicazione
  &lt;LI&gt;qual'è il posto più conveniente per modificare questo o quel setting di 
  quella applicazione&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Utilizzo di Web Services&lt;BR&gt;&lt;/STRONG&gt;  Come usare WSDL.exe 
per ottenere la classe proxy, oppure&amp;nbsp;quali metodi contiene la classe proxy per invocare 
un ws in modo sincrono ed asincrono.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Utilizzo di XML&lt;BR&gt;&lt;/STRONG&gt;La classe&amp;nbsp;XMLReader nel namespace 
System.Xml. Ricordarsi che c'è il metodo ExecuteXMLReader del SqlCommand che 
ritorna appunto un XMLReader.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Gli altri tools della command-line di .NET&lt;BR&gt;&lt;/STRONG&gt;Ricordarsi che 
&lt;STRONG&gt;TLBIMP.exe&lt;/STRONG&gt; serve per far usare un componente&amp;nbsp;scritto in 
managed code nel mondo COM (ad esempio, da C# al buon VB 6.0). 
&lt;STRONG&gt;REGASM.exe&lt;/STRONG&gt; è l'opposto.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Classe data-binding e DataView&lt;/STRONG&gt;&lt;BR&gt;Uno dei prossimi post 
parlerà di data-binding e della classe DataView. Ho incontrato parecchie domande 
che chiedevano qual'è il&amp;nbsp;modo più efficiente per filtrare righe 
e/o&amp;nbsp;ricerche.&lt;/P&gt;
&lt;P&gt;Indipendentemente dagli argomenti, ho trovato domande tranello. Se 
un'applicazione è installata sul server e gli utenti ci accedono tramite network 
share, sul mio PC non avrò &lt;STRONG&gt;mai&lt;/STRONG&gt; un file di config: questo 
ragionamento spesso porta ad escludere 2 risposte su 4. Oppure, 30 righe per 
descrivere uno scenario, mentre poi la domanda è molto più banale.&lt;/P&gt;
&lt;P&gt;Sulle domande relative al codice in sè non ho avuto grossissimi problemi: un 
po' l'esperienza personale, un po' il fatto di aver sviluppato una piccola 
applicazione, mi hanno aiutato. Le domande dei test sono di due tipi: tramite 
RadioButton (una sola è giusta, e bisogna trovarla), oppure tramite CheckBox. In 
quest'ultimo caso, ovviamente, le risposte sono più&amp;nbsp;di una. Le più 
difficili (che a me piacciono tantissimo, però) sono quelle dove bisogna 
"fleggare" più di un CheckBox per selezionare le linee di codice corrette per 
fare una determinata cosa. Difficili, dicevo, ma veramente belle!&lt;/P&gt;
&lt;P&gt;La data dell'esame è: STR((GG + MM + AAAA) + 4) &amp;amp; "2005"&lt;BR&gt;dove GG = 
giorno del mio compleanno, MM = mese del mio compleanno, AAAA = anno di 
nascita&lt;BR&gt;Notare che nella formula compare ancora il numero 4...sì, è 
deciso...è proprio il destino!&lt;BR&gt;Chi lo sa, bene! Chi non lo sa, si 
arrangi.....o magari Google dice qualcosa??? &lt;IMG height=19 src="http://www.imhoproject.org/files/risate.gif" width=19 align=absMiddle border=0&gt;&lt;/P&gt;
&lt;/FONT&gt;
&lt;FONT face=Verdana size=2&gt;&lt;P&gt;&lt;A href="http://imhoproject.org/"&gt;&lt;FONT face=Verdana size=1&gt;powered by IMHO 1.2&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;!-- Powered by IMHO Instant Blogger Copyright (c) 2004 A.Boschin - http://www.elite.boschin.it --&gt;
&lt;img src="http://blogs.ugidotnet.org/idamiani/aggbug/27429.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Igor Damiani</dc:creator>
            <guid>http://blogs.ugidotnet.org/idamiani/archive/2005/10/04/27429.aspx</guid>
            <pubDate>Tue, 04 Oct 2005 12:17:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/idamiani/archive/2005/10/04/27429.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/idamiani/comments/commentRss/27429.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/idamiani/services/trackbacks/27429.aspx</trackback:ping>
        </item>
        <item>
            <title>[MCAD.43] La sicurezza basata sull'utente di Windows</title>
            <link>http://blogs.ugidotnet.org/idamiani/archive/2005/10/03/27376.aspx</link>
            <description>&lt;FONT face=Verdana size=2&gt;
&lt;P&gt;Nei post &lt;A title="" href="http://blogs.ugidotnet.org/idamiani/archive/2005/09/14/26348.aspx" target=_new name=""&gt;[MCAD.31]&lt;/A&gt; e &lt;A title="" href="http://blogs.ugidotnet.org/idamiani/archive/2005/09/19/26633.aspx" target=_new name=""&gt;[MCAD.33]&lt;/A&gt; abbiamo visto come 
lavorare con 
.NET&amp;nbsp;avendo a che fare con&amp;nbsp;la CAS (&lt;A title="" href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconCodeAccessSecurity.asp" target=_new name=""&gt;Code Access Security&lt;/A&gt; ),    
        ovvero come assegnare o revocare 
dei permessi in base all'origine e all' "affidabilità"&amp;nbsp;del codice che sta per 
essere eseguito. In base all'URL di provenienza, a seconda che l'assembly 
venga eseguito dalle directory locali del proprio PC oppure dalla Intranet, il 
runtime .NET assegna un permission sets piuttosto che un altro. Abbiamo visto 
come usare &lt;STRONG&gt;caspol.exe&lt;/STRONG&gt;        
             
             
          oppure 
il tool analogo (Microsoft .NET Framework 1.1 Configuration) per amministrare i permessi 
in modo congruo con quello che&amp;nbsp;ci interessa&amp;nbsp;fare.&lt;/P&gt;
&lt;P&gt;Esiste anche una seconda possibilità, identica a quella che veniva usata 
nell'era pre .NET. Ovvero, assegnare dei permessi in base all'utente attualmente 
loggato sul PC, oppure al suo gruppo di appartenenza. Questa logica viene 
implementata attraverso le classi &lt;STRONG&gt;&lt;A title="" href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemsecurityprincipalwindowsidentityclasstopic.asp" target=_new name=""&gt;&lt;STRONG&gt;WindowsIdentity&lt;/STRONG&gt;&lt;/A&gt;&lt;/STRONG&gt; e 
&lt;STRONG&gt;&lt;A title="" href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemsecurityprincipalwindowsprincipalclasstopic.asp" target=_new name=""&gt;&lt;STRONG&gt;WindowsPrincipal&lt;/STRONG&gt;&lt;/A&gt;&lt;/STRONG&gt;: vediamo come usarle correttamente.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Come rilevare l'utente 
corrente ed il suo gruppo di appartenenza&lt;/STRONG&gt;&lt;BR&gt;Innanzitutto occorre 
dichiarare l'uso del namespace &lt;STRONG&gt;&lt;A title="" href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemsecurityprincipal.asp" target=_new name=""&gt;&lt;STRONG&gt;System.Security.Principal&lt;/STRONG&gt;&lt;/A&gt;&lt;/STRONG&gt;. Fatto 
questo, possiamo utilizzare le classi &lt;STRONG&gt;WindowsIdentity&lt;/STRONG&gt; e 
&lt;STRONG&gt;WindowsPrincipal&lt;/STRONG&gt;. La prima classe fa riferimento ad un 
Identity, ovvero ad uno user di Windows, mentre la seconda classe è utile perchè 
espone un metodo &lt;STRONG&gt;IsInRole&lt;/STRONG&gt; che ci permette di capire se un certo 
utente appartiene ad un gruppo specifico passato come parametro.&lt;BR&gt;Vediamo 
qualche riga di codice veloce veloce:&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: black 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; BORDER-LEFT: black 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: gainsboro"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;WindowsIdentity&amp;nbsp;io&amp;nbsp;=&amp;nbsp;WindowsIdentity.GetCurrent();&lt;BR&gt;StringBuilder&amp;nbsp;testo&amp;nbsp;=&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;new&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;StringBuilder(&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;string&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;.Empty);&lt;BR&gt;testo.AppendFormat("Tipo&amp;nbsp;di&amp;nbsp;autenticazione&amp;nbsp;:&amp;nbsp;{0};&amp;nbsp;",&amp;nbsp;io.AuthenticationType);&lt;BR&gt;testo.AppendFormat("Username&amp;nbsp;:&amp;nbsp;{0};&amp;nbsp;",&amp;nbsp;io.Name);&lt;BR&gt;testo.AppendFormat("E'&amp;nbsp;anonimo?&amp;nbsp;:&amp;nbsp;{0};&amp;nbsp;",&amp;nbsp;io.IsAnonymous);&lt;BR&gt;testo.AppendFormat("E'&amp;nbsp;autenticato?&amp;nbsp;:&amp;nbsp;{0}",&amp;nbsp;io.IsAuthenticated);&lt;BR&gt;&lt;/DIV&gt;&lt;/SPAN&gt;
&lt;P&gt;Il metodo statico &lt;STRONG&gt;GetCurrent()&lt;/STRONG&gt; ritorna un'istanza relativa 
all'utente correntemente loggato nel dominio. Mi sono divertito ad usare la 
classe &lt;STRONG&gt;StringBuilder&lt;/STRONG&gt; per costruirmi una stringa da 
 mostrare in una bella TextBox sul mio 
WF di prova. La property &lt;STRONG&gt;Name&lt;/STRONG&gt; ritorna una stringa 
formattata come: DOMAIN\Username. Nel mio caso, sul mio PC di casa, mi ha 
ritornato "TERRA\Igor". Le altre property &lt;STRONG&gt;IsAnonymous&lt;/STRONG&gt; e 
&lt;STRONG&gt;IsAuthenticated&lt;/STRONG&gt; ritornano rispettivamente valori booleani che 
indicano se l'utente è anonimo (nel mio caso, &lt;FONT color=blue&gt;false&lt;/FONT&gt;), e 
se l'utente è stato autenticato (per me &lt;FONT color=blue&gt;true&lt;/FONT&gt;).&lt;/P&gt;
&lt;P&gt;Già con queste property possiamo divertirci e adattare l'esecuzione del 
codice in modo opportuno. Per esempio, abilitare un &lt;STRONG&gt;MenuItem&lt;/STRONG&gt; 
solo se lo username è "Admin". Tramite la classe 
&lt;STRONG&gt;WindowsPrincipal&lt;/STRONG&gt; possiamo invece risalire al gruppo di 
appartenenza dell'utente stesso.&lt;/P&gt;
&lt;DIV style="BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: black 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; BORDER-LEFT: black 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: black 1px solid; BACKGROUND-COLOR: gainsboro"&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;WindowsPrincipal&amp;nbsp;prin&amp;nbsp;=&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;new&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;WindowsPrincipal(io);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #0000ff; FONT-FAMILY: Courier New"&gt;if&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: #000000; FONT-FAMILY: Courier New"&gt;(prin.IsInRole(WindowsBuiltInRole.Administrator))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;testo.Append(";&amp;nbsp;Fai&amp;nbsp;parte&amp;nbsp;degli&amp;nbsp;Administrators!");&lt;BR&gt;&lt;/DIV&gt;&lt;/SPAN&gt;
&lt;P&gt;Il metodo &lt;STRONG&gt;IsInRole&lt;/STRONG&gt; possiede 3 overload diversi: posso usare 
l'enum &lt;STRONG&gt;WindowsBuiltInRole &lt;/STRONG&gt;(come nell'esempio qui sopra), posso 
usare un valore &lt;FONT color=blue&gt;int&lt;/FONT&gt; (???) 
oppure, infine, posso usare una &lt;FONT color=blue&gt;string&lt;/FONT&gt;  
    . La chiamata al metodo &lt;STRONG&gt;IsInRole&lt;/STRONG&gt; 
ritorna un valore boolean che ci dice se l'utente passato nel costruttore di 
WindowsPrincipal appartiene o meno al gruppo passato 
come parametro.&lt;/P&gt;
&lt;P&gt;Il codice qui sopra mi dice&amp;nbsp;se appartengo al gruppo degli Administrators: nel mio caso, sì. 
Purtroppo, non sono riuscito ad ottenere lo stesso risultato usando come 
parametro una &lt;FONT color=blue&gt;string&lt;/FONT&gt;: ho provato 
"DOMINIO\Administrators", "DOMINIO\Administrator" e tutte le possibili varianti 
(usare il nome del PC al posto del dominio, per esempio), ma in tutti i casi mi 
ha sempre ritornato &lt;FONT color=blue&gt;false&lt;/FONT&gt;.&lt;BR&gt;Con l'enum &lt;STRONG&gt;&lt;A title="" href="http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemsecurityprincipalwindowsbuiltinroleclasstopic.asp" target=_new name=""&gt;&lt;STRONG&gt;WindowsBuiltInRole&lt;/STRONG&gt;&lt;/A&gt;&lt;/STRONG&gt; nessun problema: 
continuerò, se mi servirà, ad usare questo.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Sicuramente c'è ancora molto da dire, ma...&lt;BR&gt;&lt;/STRONG&gt;Quando si ha 
a che fare con la sicurezza delle applicazioni, c'è sempre molto da dire e molto 
da imparare. Se siccome il giorno dell'esame si avvicina, chiudo qua il 
discorso. &lt;IMG height=19 src="http://www.imhoproject.org/files/risate.gif" width=19 align=absMiddle border=0&gt;&lt;/P&gt;
&lt;P&gt;I prossimi post saranno più che altro mirati a parlare degli 
argomenti&amp;nbsp;"minori" che ho tralasciato, come i files *.config (che odio, non 
sopporto e, ne sono certo, all'esame mi fregheranno) ed alcuni tools della 
command-line come &lt;STRONG&gt;tlbimp.exe&lt;/STRONG&gt; ed affini. Qualsiasi suggerimento 
è, come al solito, ben accetto!&lt;BR&gt;Alla prossima...&lt;/P&gt;
&lt;/FONT&gt;
&lt;FONT face=Verdana size=2&gt;&lt;P&gt;&lt;A href="http://imhoproject.org/"&gt;&lt;FONT face=Verdana size=1&gt;powered by IMHO 1.2&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;!-- Powered by IMHO Instant Blogger Copyright (c) 2004 A.Boschin - http://www.elite.boschin.it --&gt;
&lt;img src="http://blogs.ugidotnet.org/idamiani/aggbug/27376.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Igor Damiani</dc:creator>
            <guid>http://blogs.ugidotnet.org/idamiani/archive/2005/10/03/27376.aspx</guid>
            <pubDate>Mon, 03 Oct 2005 13:41:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/idamiani/archive/2005/10/03/27376.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/idamiani/comments/commentRss/27376.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/idamiani/services/trackbacks/27376.aspx</trackback:ping>
        </item>
        <item>
            <title>[MCAD.42] Lo sapevate che...alcune piccole chicche...</title>
            <link>http://blogs.ugidotnet.org/idamiani/archive/2005/09/29/27216.aspx</link>
            <description>&lt;FONT face=Verdana size=2&gt;
&lt;P&gt;La classe &lt;STRONG&gt;SqlCommand&lt;/STRONG&gt; 
dispone del &lt;A title="" href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdatasqlclientsqlcommandclasspreparetopic.asp" target=_new name=""&gt;metodo &lt;STRONG&gt;Prepare&lt;/STRONG&gt;&lt;/A&gt; per ottimizzarne l'esecuzione?&lt;BR&gt;E che prima di 
chiamarlo dobbiamo settare i data-type di tutti i parametri, soprattutto la 
proprietà &lt;STRONG&gt;Size&lt;/STRONG&gt; per tutti quei parametri che hanno una lunghezza 
variabile?&lt;/P&gt;
&lt;P&gt;Esiste&amp;nbsp;la &lt;A title="" href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/csref/html/vclrfChecked.asp" target=_new name=""&gt;keywork&amp;nbsp;&lt;STRONG&gt;checked&lt;/STRONG&gt;&lt;/A&gt; che serve a controllare gli 
overflow nelle espressioni?&lt;/P&gt;
&lt;P&gt;Esiste la &lt;A title="" href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/csref/html/vclrfusingstatement.asp" target=_new name=""&gt;keyword &lt;STRONG&gt;using&lt;/STRONG&gt;&lt;/A&gt; che serve (anche) ad 
iniziare&amp;nbsp;blocchi di codice al termine dei quali viene fatta automaticamente 
la &lt;STRONG&gt;Dispose&lt;/STRONG&gt; dell'oggetto indicato al momento della sua 
dichiarazione?&lt;/P&gt;
&lt;P&gt;Lo strumento più corretto per distribuire un assembly nella GAC di 
un&amp;nbsp;cliente&amp;nbsp;non è &lt;STRONG&gt;gacutil&lt;/STRONG&gt;, ma &lt;STRONG&gt;Windows 
Installer&lt;/STRONG&gt;! Perchè?&amp;nbsp;Perchè gacutil non incrementa il reference 
counter dell'assembly: gacutil va usato solo in ambiente di sviluppo, mentre 
Windows Installer in tutti gli altri casi.&lt;/P&gt;
&lt;P&gt;Esiste un&amp;nbsp;metodo della classe 
&lt;STRONG&gt;String&lt;/STRONG&gt; che ritorna un boolean che dice se la stringa stessa 
termina con una stringa passata come parametro? Il metodo in questione si chiama 
&lt;STRONG&gt;EndsWith&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;Esiste la property &lt;STRONG&gt;MdiList&lt;/STRONG&gt; del &lt;STRONG&gt;MenuItem&lt;/STRONG&gt; 
che, se messa a &lt;FONT color=blue&gt;true&lt;/FONT&gt;,&amp;nbsp;permette di popolare un menù 
con tutte le finestre contenute nel form MDI.&lt;/P&gt;
&lt;P&gt;Come faccio a far comparire una Windows Form nel punto indicato dalla sua 
property &lt;STRONG&gt;Location&lt;/STRONG&gt;? Oltre a specificare Location, devo impostare 
&lt;STRONG&gt;StartPosition = Manual&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;Posso creare via codice un &lt;STRONG&gt;ContextMenu&lt;/STRONG&gt; uguale a quello di un 
&lt;STRONG&gt;MainMenu&lt;/STRONG&gt;, usando il metodo &lt;STRONG&gt;CloneMenu&lt;/STRONG&gt; applicato 
sul MainMenu che ci interessa duplicare.&lt;/P&gt;
&lt;P&gt;La classe &lt;STRONG&gt;System.Windows.Forms.Form&lt;/STRONG&gt; deriva dalla classe 
&lt;STRONG&gt;ControlContainer&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;Un oggetto viene definito &lt;STRONG&gt;stateful&lt;/STRONG&gt; quando mantiene&amp;nbsp;il 
suo&amp;nbsp;stato interno&amp;nbsp;tra una chiamata ad un metodo ed un'altra. Questo in 
contrapposizione a &lt;STRONG&gt;stateless&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;Posso decorare un metodo con la classe &lt;STRONG&gt;DebuggerStepThrough&lt;/STRONG&gt; 
per dire al debugger di non entrare nel metodo stesso. Posso comunque inserire 
breakpoints, ma non ci arriverò mai.&lt;/P&gt;
&lt;/FONT&gt;
&lt;FONT face=Verdana size=2&gt;&lt;P&gt;&lt;A href="http://imhoproject.org/"&gt;&lt;FONT face=Verdana size=1&gt;powered by IMHO 1.2&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;!-- Powered by IMHO Instant Blogger Copyright (c) 2004 A.Boschin - http://www.elite.boschin.it --&gt;
&lt;img src="http://blogs.ugidotnet.org/idamiani/aggbug/27216.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Igor Damiani</dc:creator>
            <guid>http://blogs.ugidotnet.org/idamiani/archive/2005/09/29/27216.aspx</guid>
            <pubDate>Thu, 29 Sep 2005 12:55:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/idamiani/archive/2005/09/29/27216.aspx#feedback</comments>
            <slash:comments>9</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/idamiani/comments/commentRss/27216.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/idamiani/services/trackbacks/27216.aspx</trackback:ping>
        </item>
    </channel>
</rss>