WamBlog http://blogs.ugidotnet.org/WamBlog/Default.aspx Il blog di Diego Martelli it-IT Diego Martelli Subtext Version 2.6.0.0 WamBlog http://blogs.ugidotnet.org/images/RSS2Image.gif http://blogs.ugidotnet.org/WamBlog/Default.aspx 77 60 C#: uno strano comportamento con l'override C# http://blogs.ugidotnet.org/WamBlog/archive/2008/11/01/c-uno-strano-comportamento-con-loverride.aspx <p>Per una buona comprensione di questo post è necessario conoscere l'ereditarietà a livello elementare e cosa sono i <a title="cosa sono i params" href="http://msdn.microsoft.com/it-it/library/w5zay9db(en-us,VS.71).aspx" target="_blank">params</a>.</p> <p>Ieri mi sono trovato all'improvviso in un loop infinito. Per quanto potesse essere chiaro cosa stava succedendo, non mi è stato subito chiaro il PERCHE'.</p> <p>Oggi ho scritto un po' di codice in modo da mettere la situazione su un "banco di prova".</p> <p>La necessità era quella di ampliare una classe di log in modo da incorporare una funzionalità inn stile string.format. </p> <div class="csharpcode"> <pre class="alt"><span class="lnum"> 1: </span> <span class="kwrd">public</span> <span class="kwrd">class</span> clsLogger</pre> <pre><span class="lnum"> 2: </span> {</pre> <pre class="alt"><span class="lnum"> 3: </span> <span class="kwrd">public</span> <span class="kwrd">void</span> scrivi(<span class="kwrd">string</span> Msg)</pre> <pre><span class="lnum"> 4: </span> {</pre> <pre class="alt"><span class="lnum"> 5: </span> Console.WriteLine(<span class="str">"1)"</span> + Msg);</pre> <pre><span class="lnum"> 6: </span> }</pre> <pre class="alt"><span class="lnum"> 7: </span> <span class="kwrd">public</span> <span class="kwrd">void</span> scrivi(<span class="kwrd">string</span> Msg, <span class="kwrd">params</span> <span class="kwrd">object</span>[] arg)</pre> <pre><span class="lnum"> 8: </span> {</pre> <pre class="alt"><span class="lnum"> 9: </span> scrivi(<span class="str">"2)"</span> + <span class="kwrd">string</span>.Format(Msg, arg));</pre> <pre><span class="lnum"> 10: </span> }</pre> <pre class="alt"><span class="lnum"> 11: </span> }</pre> <pre><span class="lnum"> 12: </span> </pre> <pre class="alt"><span class="lnum"> 13: </span> </pre> <pre><span class="lnum"> 14: </span> <span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args)</pre> <pre class="alt"><span class="lnum"> 15: </span> {</pre> <pre><span class="lnum"> 16: </span> Console.WriteLine(<span class="str">"********* Test Overload ***********"</span>);</pre> <pre class="alt"><span class="lnum"> 17: </span> </pre> <pre><span class="lnum"> 18: </span> clsLogger Test = <span class="kwrd">new</span> clsLogger();</pre> <pre class="alt"><span class="lnum"> 19: </span> Test.scrivi(<span class="str">"Scrivi"</span>);</pre> <pre><span class="lnum"> 20: </span> Test.scrivi(<span class="str">"Scrivi, parametro: {0}"</span>, 123456);</pre> <pre class="alt"><span class="lnum"> 21: </span> </pre> <pre><span class="lnum"> 22: </span> Console.ReadKey();</pre> <pre class="alt"><span class="lnum"> 23: </span> }</pre> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style></div> <p>In questo modo il compilatore è perfettamente in grado di distinguere i due metodi: la chiamata scrivi della riga 19 si riferisce al metodo scrivi della riga 3 mentre la chiamata della riga 20 alla funzione scrivi della riga 7.</p> <p>Complichiamoci un poco la situazione: la nostra classe di log deve estenderne una di base in cui è definito il metodo scrivi semplice.</p> <div class="csharpcode"> <pre class="alt"><span class="lnum"> 1: </span> <span class="kwrd">public</span> <span class="kwrd">class</span> clsLoggerBase</pre> <pre><span class="lnum"> 2: </span> {</pre> <pre class="alt"><span class="lnum"> 3: </span> <span class="kwrd">public</span> <span class="kwrd">virtual</span> <span class="kwrd">void</span> scrivi(<span class="kwrd">string</span> Msg)</pre> <pre><span class="lnum"> 4: </span> {</pre> <pre class="alt"><span class="lnum"> 5: </span> Console.WriteLine(<span class="str">"1)"</span> + Msg);</pre> <pre><span class="lnum"> 6: </span> }</pre> <pre class="alt"><span class="lnum"> 7: </span> }</pre> <pre><span class="lnum"> 8: </span> </pre> <pre class="alt"><span class="lnum"> 9: </span> <span class="kwrd">public</span> <span class="kwrd">class</span> clsLoggerInherits : clsLoggerBase</pre> <pre><span class="lnum"> 10: </span> {</pre> <pre class="alt"><span class="lnum"> 11: </span> <span class="kwrd">public</span> <span class="kwrd">override</span> <span class="kwrd">void</span> scrivi(<span class="kwrd">string</span> Msg)</pre> <pre><span class="lnum"> 12: </span> {</pre> <pre class="alt"><span class="lnum"> 13: </span> <span class="kwrd">base</span>.scrivi(Msg);</pre> <pre><span class="lnum"> 14: </span> }</pre> <pre class="alt"><span class="lnum"> 15: </span> <span class="kwrd">public</span> <span class="kwrd">void</span> scrivi(<span class="kwrd">string</span> Msg, <span class="kwrd">params</span> <span class="kwrd">object</span>[] arg)</pre> <pre><span class="lnum"> 16: </span> {</pre> <pre class="alt"><span class="lnum"> 17: </span> scrivi(<span class="str">"2)"</span> + <span class="kwrd">string</span>.Format(Msg, arg));</pre> <pre><span class="lnum"> 18: </span> }</pre> <pre class="alt"><span class="lnum"> 19: </span> }</pre> <pre><span class="lnum"> 20: </span> </pre> <pre class="alt"><span class="lnum"> 21: </span> <span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args)</pre> <pre><span class="lnum"> 22: </span> {</pre> <pre class="alt"><span class="lnum"> 23: </span> Console.WriteLine(<span class="str">"********* Test Overload ***********"</span>);</pre> <pre><span class="lnum"> 24: </span> </pre> <pre class="alt"><span class="lnum"> 25: </span> clsLoggerInherits Test = <span class="kwrd">new</span> clsLoggerInherits();</pre> <pre><span class="lnum"> 26: </span> Test.scrivi(<span class="str">"Scrivi"</span>);</pre> <pre class="alt"><span class="lnum"> 27: </span> Test.scrivi(<span class="str">"Scrivi, parametro: {0}"</span>, 123456);</pre> <pre><span class="lnum"> 28: </span> </pre> <pre class="alt"><span class="lnum"> 29: </span> Console.ReadKey();</pre> <pre><span class="lnum"> 30: </span> }</pre> </div> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p>In questo caso il compilatore referenzia sempre il metodo della riga 15. Questo avviene sia nelle due chiamate alle righe 26 e 27 della funzione Main, sia nella chiamate interna di riga 17 (che diventa ricorsiva generando un'eccezione di stackoverflow). </p> <p>Anche non sovrascrivendo la funzione scrivi in clsLoggerInherits otteniamo la stessa situazione.</p> <div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:86728c7c-f545-46dd-8eb7-ce10a31244bd" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati Tag: <a href="http://technorati.com/tags/c#" rel="tag">c#</a>,<a href="http://technorati.com/tags/ASP.NET" rel="tag">ASP.NET</a>,<a href="http://technorati.com/tags/curiosit%c3%a0" rel="tag">curiosità</a>,<a href="http://technorati.com/tags/params" rel="tag">params</a>,<a href="http://technorati.com/tags/overloading" rel="tag">overloading</a></div><img src="http://blogs.ugidotnet.org/WamBlog/aggbug/94481.aspx" width="1" height="1" /> Diego Martelli http://blogs.ugidotnet.org/WamBlog/archive/2008/11/01/c-uno-strano-comportamento-con-loverride.aspx Sat, 01 Nov 2008 14:39:36 GMT http://blogs.ugidotnet.org/WamBlog/archive/2008/11/01/c-uno-strano-comportamento-con-loverride.aspx#feedback 75 http://blogs.ugidotnet.org/WamBlog/comments/commentRss/94481.aspx http://blogs.ugidotnet.org/WamBlog/services/trackbacks/94481.aspx Ajax.NET Javascript: Validazione dei parametri http://blogs.ugidotnet.org/WamBlog/archive/2008/05/28/ajax.net-javascript-validazione-dei-parametri.aspx <p>Esiste una funzione nascosta nell'ajax.net che si occupa della validazione dei parametri: <strong>Function._validateParams</strong>. Inizialmente questa funzione esisteva solo in debug, mentre in release veniva usata la versione compressa: per noi programmatori era inutilizzabile. Tuttavia nella versione rilasciata del framework hanno cambiato idea lasciando la definizione. </p> <p>Dato che il nome di questa funzione inizia con "_" dovremmo considerarla privata o interna alla classe Function: ma dato che trovo questa funzione molto utile ho deciso di ignorare bellamente la questione e di farne uso.</p> <p>In sostanza cosa consente di fare? Di validare facilmente i parametri di una funzione. Attraverso un array di oggetti e la lista dei parametri verifica il tipo, il numero e altre informazioni. Se c'è una differenza fra quanto richiediamo e quello che viene passato lancia un'eccezione.</p> <div class="csharpcode"> <pre class="alt"><span class="lnum"> 1: </span>function onlyString(str)</pre> <pre><span class="lnum"> 2: </span>{</pre> <pre class="alt"><span class="lnum"> 3: </span> <span class="rem">//Parameter validation</span></pre> <pre><span class="lnum"> 4: </span> var e = Function._validateParams(arguments,</pre> <pre class="alt"><span class="lnum"> 5: </span> [{name: <span class="str">"str"</span>, type: String, elementMayBeNull: <span class="kwrd">false</span>,optional:<span class="kwrd">false</span>}]);</pre> <pre><span class="lnum"> 6: </span> <span class="kwrd">if</span> (e) {<span class="kwrd">throw</span> e;} <span class="rem">//On Parameter error throw an exception</span></pre> <pre class="alt"><span class="lnum"> 7: </span> </pre> <pre><span class="lnum"> 8: </span> <span class="rem">//Main code</span></pre> <pre class="alt"><span class="lnum"> 9: </span> alert(str);</pre> <pre><span class="lnum"> 10: </span>}</pre> </div> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p>Come possiamo facilmente capire onlyString è una funzione fondamentale per la nostra webApplication. Ci sono due parametri da passare: <strong>arguments</strong>  e <strong>l'Array di configurazione</strong>. Questo contiene oggetti che spiegano alla funzione come deve controllare ogni parametro. E' importante inserire un oggetto di configurazione per ogni parametro altrimenti avremo un'eccezione che ci avverte che il numero di parametri è sbagliato. Per comodità possiamo creare l'Array delle configurazioni inline tramite JSON. </p> <p>Vogliamo essere sicuri che il parametro str sia una stringa, non sia null e che venga passato: </p> <div class="csharpcode"> <pre class="alt"><span class="lnum"> 1: </span>[{name: <span class="str">"str"</span>, type: String, elementMayBeNull: <span class="kwrd">false</span>,optional:<span class="kwrd">false</span>}]</pre> </div> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p>Ma cosa possiamo settare nel singolo oggetto di configurazione? Ci viene in aiuto Jay Kimble con un suo post di Aprile '07 su CodeBetter:</p> <ul> <li><strong>type</strong> - (Type) Indica di che tipo deve essere il parametro (Alcuni esempi: Array, Function, String, Sys.Component, ma soprattuto le nostre classi)</li> <li><strong>mayBeNull</strong> -(boolean) Se il parametro accetta null come valore</li> <li><strong>integer</strong> - (boolean) indica che il parametro deve essere un intero</li> <li><strong>domElement</strong> - (boolean) Il parametro deve essere un elemento del DOM (div, table, span, ...) </li> <li><strong>optional</strong> - (boolean) Indica se il parametro è opzionale e quindi può essere omesso. </li> <li><strong>elementType</strong> - (Type) - se type è 'Array': Indica il tipo di dato accettato nell'array.</li> <li><strong>elementInteger</strong> - (boolean) se type è 'Array' si assicura che sia un Array di interi</li> <li><strong>elementDomElement</strong> - (boolean) se type è 'Array' si assicura che sia un Array di elementi del dom</li> <li><strong>elementMayBeNull</strong> -(boolean) se type è 'Array' valuta se gli elementi dell'Array possono essere null.</li> </ul> <p>Qui trovate due link che possono aiutarvi ad approfondire:</p> <ul> <li><a title="Jay Kimble" href="http://codebetter.com/blogs/jay.kimble/archive/2007/04/26/msajax-clientscript-unpublished-validation-function.aspx">L'Articolo di Jay Kimble su CodeBetter</a></li> <li><a title="Alessando Gallo" href="http://aspadvice.com/blogs/garbin/archive/2006/11/08/Strongly-typed-collections-with-JavaScript-and-Microsoft-Ajax_3F00_.aspx">Un Esempio d'uso da parte di Alessando Gallo con una collection javascript tipizzata</a></li> </ul> <p> </p> <div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:a17d2345-15d7-404d-a565-80e359101bc3" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati Tag: <a href="http://technorati.com/tags/ASP.NET" rel="tag">ASP.NET</a>,<a href="http://technorati.com/tags/Ajax" rel="tag">Ajax</a>,<a href="http://technorati.com/tags/Ajax.NET" rel="tag">Ajax.NET</a>,<a href="http://technorati.com/tags/javascript" rel="tag">javascript</a>,<a href="http://technorati.com/tags/parameter%20validation" rel="tag">parameter validation</a></div><img src="http://blogs.ugidotnet.org/WamBlog/aggbug/92833.aspx" width="1" height="1" /> Diego Martelli http://blogs.ugidotnet.org/WamBlog/archive/2008/05/28/ajax.net-javascript-validazione-dei-parametri.aspx Wed, 28 May 2008 02:04:38 GMT http://blogs.ugidotnet.org/WamBlog/archive/2008/05/28/ajax.net-javascript-validazione-dei-parametri.aspx#feedback 13 http://blogs.ugidotnet.org/WamBlog/comments/commentRss/92833.aspx http://blogs.ugidotnet.org/WamBlog/services/trackbacks/92833.aspx Passare dati fra WebForm ASP.NET http://blogs.ugidotnet.org/WamBlog/archive/2008/05/24/passare-dati-fra-webform.aspx <h3>Nota</h3> <p>Sul forum di asp.net ho trovato un riferimento ad un <a title="Post sul passaggio dei parametri di Hassan" href="http://dotnetslackers.com/Community/blogs/haissam/archive/2007/11/26/ways-to-pass-data-between-webforms.aspx" target="_blank">post</a> si Haissam. Mi è sembrato molto ben fatto e visto che questo problema ritorna con un'increadibile frequenza nei forum ho deciso di postare qui una traduzione dell'articolo sperando che possa aiutare i programmatori italiani:</p> <h4> </h4> <p></p> <p>In questo post, vi mostrerò diversi modi di passare informazioni fra webform. Si possono adottare diverse tecniche, dipende tutto da cosa vi serve!</p> <p>Sappiamo tutti che l'Http non gestisce lo stato, quindi le informazioni dovranno essere salvate da qualche parte per poterle poi recuperare.</p> <ol> <li>Query String</li> <li>Cookies</li> <li>Variabili di Sessione</li> <li>Cross Page Postback </li> <li>Form Submit</li> <li>Server.Trasnfer o Server.Execute</li> </ol> <p> <br />Parleremo in dettaglio di ognuna specificando quali tipi possono lavorare.</p> <h3></h3> <h3>1) QueryString: </h3> <p>Usando le variabili in query string puoi passare varibili fra webform. Supponiamo che tu debba passare il contenuto di TextBox1.Text da WebForm1 a WebForm2 alla pressione di un pulsante:</p> <div class="csharpcode"> <pre class="alt"><span class="lnum"> 1: </span><span class="kwrd">protected</span> <span class="kwrd">void</span> Button1_Click(<span class="kwrd">object</span> sender, EventArgs e)</pre> <pre><span class="lnum"> 2: </span>{</pre> <pre class="alt"><span class="lnum"> 3: </span> Response.Redirect(<span class="str">"WebForm2.aspx?id="</span> + TextBox1.Text);</pre> <pre><span class="lnum"> 4: </span>}</pre> </div> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style><style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p>Per leggere il valore di "id" da WebForm2:</p> <div class="csharpcode"> <pre class="alt"><span class="lnum"> 1: </span><span class="kwrd">string</span> queryStringID = Request.QueryString[<span class="str">"id"</span>];</pre> </div> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <h3>2) Cookies:</h3> <p>Come probabilmente già sai, i cookies sono piccoli file di testo salvati sul client. I Cookie possono contenere massimo 4kb circa. Da quando i cookie si trovano sul client ad ogni richiesta del client al tuo sito, il browser cerca i cookie e li spedisce nell'oggetto Request.</p> <p>Es: Per Salvare il valore di TextBox1.Text in un cookie:</p> <div class="csharpcode"> <pre class="alt"><span class="lnum"> 1: </span><span class="kwrd">protected</span> <span class="kwrd">void</span> Button1_Click(<span class="kwrd">object</span> sender, EventArgs e)</pre> <pre><span class="lnum"> 2: </span>{</pre> <pre class="alt"><span class="lnum"> 3: </span> HttpCookie cookie = <span class="kwrd">new</span> HttpCookie(<span class="str">"UserName"</span>);</pre> <pre><span class="lnum"> 4: </span> cookie.Value = TextBox1.Text;</pre> <pre class="alt"><span class="lnum"> 5: </span> cookie.Expires = DateTime.Now.AddDays(1);</pre> <pre><span class="lnum"> 6: </span> Response.Cookies.Add(cookie);</pre> <pre class="alt"><span class="lnum"> 7: </span> Response.Redirect(<span class="str">"WebForm2.aspx"</span>);</pre> <pre><span class="lnum"> 8: </span>}</pre> </div> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p>Adesso nel Page_Load di WebForm2, possiamo leggere il valore:</p> <div class="csharpcode"> <pre class="alt"><span class="lnum"> 1: </span><span class="kwrd">if</span>(Request.Cookies[<span class="str">"UserName"</span>] != <span class="kwrd">null</span>)</pre> <pre><span class="lnum"> 2: </span>{</pre> <pre class="alt"><span class="lnum"> 3: </span> Response.Write(Request.Cookies[<span class="str">"UserName"</span>].Value);</pre> <pre><span class="lnum"> 4: </span>}</pre> </div> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <h3>3) Variabili di Sessione:</h3> <p>Per Default le variabili di sessione sono salvate nella memoria del webserver. Le Sessioni sono uniche per ogni utente.</p> <p>Per salvare una variabile di sessione:</p> <div class="csharpcode"> <pre class="alt"><span class="lnum"> 1: </span><span class="kwrd">protected</span> <span class="kwrd">void</span> Button1_Click(<span class="kwrd">object</span> sender, EventArgs e)</pre> <pre><span class="lnum"> 2: </span>{</pre> <pre class="alt"><span class="lnum"> 3: </span> Session[<span class="str">"UserName"</span>] = TextBox1.Text;</pre> <pre><span class="lnum"> 4: </span> Response.Redirect(<span class="str">"WebForm2.aspx"</span>);</pre> <pre class="alt"><span class="lnum"> 5: </span>}</pre> </div> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p>Per leggere il valore da WebForm2:</p> <div class="csharpcode"> <pre class="alt"><span class="lnum"> 1: </span>Response.Write(Session[<span class="str">"UserName"</span>]);</pre> </div> <h3>4) Cross Page Postback (ASP.NET 2.0):</h3> <p>Il cross page postback è stato introdotto con l'ASP.NET 2.0. Ho già scritto un post in merito.</p> <p>Ex: Setta la proprietà PostBackUrl di Button1 indirizzandolo a WebForm2.aspx.</p> <p>Inserisci questo codice in WebForm2 per leggere il valore di TextBox1:</p> <div class="csharpcode"> <pre class="alt"><span class="lnum"> 1: </span>TextBox txtFirstPage = (TextBox)(PreviousPage.FindControl(<span class="str">"TextBox1"</span>));</pre> <pre><span class="lnum"> 2: </span>Response.Write(String.Format(<span class="str">"You wrote {0} in Page1"</span>,txtFirstPage.Text));</pre> </div> <h3>5) Submit Form:</h3> <p>Possimao eseguire il submit di un form in WebForm1.aspx a webform2.aspx. In questo caso possiamo recuperare tutti gli elementi contenuti nel form di webform1 da webform2. Quello che faremo in questo esempio è di aggiungere un altro form (non server side) che conterrà due controlli html. Il primo sarà un submit ed il secondo sarà un campo hidden che conterrà il valore del controllo server TextBox1 per poter essere inviato a webform2.</p> <div class="csharpcode"> <pre class="alt"><span class="lnum"> 1: </span><span class="kwrd">&lt;</span><span class="html">form</span> <span class="attr">id</span><span class="kwrd">="Form1"</span> <span class="attr">method</span><span class="kwrd">="post"</span> <span class="attr">runat</span><span class="kwrd">="server"</span><span class="kwrd">&gt;</span></pre> <pre><span class="lnum"> 2: </span> <span class="kwrd">&lt;</span><span class="html">asp:TextBox</span> <span class="attr">ID</span><span class="kwrd">="TextBox1"</span> <span class="attr">runat</span><span class="kwrd">="server"</span><span class="kwrd">&gt;&lt;/</span><span class="html">asp:TextBox</span><span class="kwrd">&gt;</span></pre> <pre class="alt"><span class="lnum"> 3: </span><span class="kwrd">&lt;/</span><span class="html">form</span><span class="kwrd">&gt;</span></pre> <pre><span class="lnum"> 4: </span><span class="kwrd">&lt;</span><span class="html">form</span> <span class="attr">name</span><span class="kwrd">="SubmittedForm"</span> <span class="attr">action</span><span class="kwrd">="WebForm2.aspx"</span> <span class="attr">method</span><span class="kwrd">="post"</span><span class="kwrd">&gt;</span></pre> <pre class="alt"><span class="lnum"> 5: </span> <span class="kwrd">&lt;</span><span class="html">input</span> <span class="attr">id</span><span class="kwrd">="Submit1"</span> <span class="attr">type</span><span class="kwrd">="submit"</span> <span class="attr">value</span><span class="kwrd">="submit"</span> <span class="attr">onclick</span><span class="kwrd">="CopyTextToHiddenField()"</span> <span class="kwrd">/&gt;</span></pre> <pre><span class="lnum"> 6: </span> <span class="kwrd">&lt;</span><span class="html">input</span> <span class="attr">name</span><span class="kwrd">="Hidden1"</span> <span class="attr">type</span><span class="kwrd">="hidden"</span> <span class="kwrd">/&gt;</span></pre> <pre class="alt"><span class="lnum"> 7: </span><span class="kwrd">&lt;/</span><span class="html">form</span><span class="kwrd">&gt;</span></pre> </div> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p>Ovviamente ti sarai accorto che abbiamo gestito l'evento onclick del controllo submit che chiamerà una funzione javascript per copiare il valore di TextBox1 nel campo hidden (Hidden1) per poter essere inviato a WebForm2. Avrai anche notato l'attributo action del secondo form in cui specifichiamo in quale pagina dobbiamo essere reindirizzati.</p> <p>Aggiungiamo questo javascript nella &lt;head&gt; di WebForm1</p> <div class="csharpcode"> <pre class="alt"><span class="lnum"> 1: </span><span class="kwrd">&lt;</span><span class="html">script</span> <span class="attr">language</span><span class="kwrd">="javascript"</span><span class="kwrd">&gt;</span></pre> <pre><span class="lnum"> 2: </span> <span class="kwrd">function</span> CopyTextToHiddenField()</pre> <pre class="alt"><span class="lnum"> 3: </span> {</pre> <pre><span class="lnum"> 4: </span> <span class="kwrd">var</span> textbox1Value = document.getElementById(<span class="str">"&lt;%=TextBox1.ClientID%&gt;"</span>).value;</pre> <pre class="alt"><span class="lnum"> 5: </span> document.forms[1].document.getElementById(<span class="str">"Hidden1"</span>).value = textbox1Value;</pre> <pre><span class="lnum"> 6: </span> }</pre> <pre class="alt"><span class="lnum"> 7: </span><span class="kwrd">&lt;/</span><span class="html">script</span><span class="kwrd">&gt;</span></pre> </div> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p>Adesso possiamo recuperare il valore di Hidden1 da WebForm2 con questo codice:</p> <div class="csharpcode"> <pre class="alt"><span class="lnum"> 1: </span>Response.Write(Request.Form[<span class="str">"Hidden1"</span>]); </pre> <br /></div> <h3>6) Server.Transfer e Server.Execute</h3> <p>Queste due funzioni accettano 2 parametri. Il primo è il nome della webform a cui si vuol fare il redirect, il secondo è un parametro booleiano che specifica se il form debba essere preservato.</p> <div class="csharpcode"> <pre class="alt"><span class="lnum"> 1: </span><span class="kwrd">protected</span> <span class="kwrd">void</span> Button1_Click1(<span class="kwrd">object</span> sender, EventArgs e)</pre> <pre><span class="lnum"> 2: </span>{</pre> <pre class="alt"><span class="lnum"> 3: </span> Server.Transfer(<span class="str">"WebForm2.aspx"</span>, <span class="kwrd">true</span>);</pre> <pre><span class="lnum"> 4: </span>}</pre> </div> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p>Adesso nel page_load di  WebForm2 possiamo usare questo codice per leggere il valore di TextBox1</p> <div class="csharpcode"> <pre class="alt"><span class="lnum"> 1: </span>Response.Write(Request.Form[<span class="str">"TextBox1"</span>]);</pre> </div> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p>il codice per Server.Execute è identico.</p> <p> <br />Spero che questo post possa essere d'aiuto e ringrazio Haissam per avermi autorizzato alla pubblicazione della traduzione. </p> <p>Per eventuali domande/suggerimenti/altro contattatemi pure.</p> <p><a title="Post sul passaggio dei parametri di Hassan" href="http://dotnetslackers.com/Community/blogs/haissam/archive/2007/11/26/ways-to-pass-data-between-webforms.aspx" target="_blank">Link al post originale di Haissam</a> </p> <div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:593dd851-015f-4f22-ad97-bdd4f9fa9d14" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati Tag: <a href="http://technorati.com/tags/ASP.NET" rel="tag">ASP.NET</a>,<a href="http://technorati.com/tags/Postback" rel="tag">Postback</a>,<a href="http://technorati.com/tags/Pass%20data" rel="tag">Pass data</a></div><img src="http://blogs.ugidotnet.org/WamBlog/aggbug/92791.aspx" width="1" height="1" /> Diego Martelli http://blogs.ugidotnet.org/WamBlog/archive/2008/05/24/passare-dati-fra-webform.aspx Sat, 24 May 2008 12:22:03 GMT http://blogs.ugidotnet.org/WamBlog/archive/2008/05/24/passare-dati-fra-webform.aspx#feedback 7 http://blogs.ugidotnet.org/WamBlog/comments/commentRss/92791.aspx http://blogs.ugidotnet.org/WamBlog/services/trackbacks/92791.aspx Custom Event in Custom Control ASP.NET - Contolli http://blogs.ugidotnet.org/WamBlog/archive/2008/05/24/custom-event-in-custom-control.aspx <h3></h3> <h3>Introduzione</h3> <p>In una logica di programmazione basata su i controlli è normale avere la necessità di creare eventi per comunicare con la pagina o più in generale con l'oggetto contenitore. In questo articolo vedremo come fare passo dopo passo. </p> <p>Nonostante la tecnica per la gestione degli eventi nei controlli server e nei controlli client (ascx) sia identica, la solution allegata contiene esempi di realizzazione con entrambi i tipi di controllo.</p> <h3></h3> <h3>Cosa vogliamo realizzare?</h3> <p>Un semplice controllo dotato di un textbox e un pulsante. Alla pressione del pulsante il controllo deve generare un evento in cui notifica il valore contenuto nella textbox. La Pagina contenitore intercetta l'evento del controllo e scrive il testo notificato in una label.</p> <h3>Lista della spesa: Di cosa abbiamo bisogno?</h3> <p>1) un <u>Delegate</u>: un delegate è un modo per rappresentare la signtaure di un metodo: Quanti e quali parametri deve avere e qual'è il tipo restituito dalla funzione? Nel nostro caso rappresenta "come deve essere fatta" la funzione di risposta all'evento <a title="http://msdn.microsoft.com/it-it/library/900fyy8e(en-us).aspx" href="http://msdn.microsoft.com/it-it/library/900fyy8e(en-us).aspx">http://msdn.microsoft.com/it-it/library/900fyy8e(en-us).aspx</a></p> <p>2) un <u>Evento</u>: Semplicemente abbiamo bisogno di definirlo come attributo e specificare il delagate a cui fa riferimento</p> <h3>Parte 1 - Prepariamo il nostro evento:</h3> <p>Iniziamo con il dichiarare nel nostro controllo il delegate e l'evento:</p> <div class="csharpcode"> <pre class="alt"> <span class="rem">/// &lt;summary&gt;</span></pre> <pre> <span class="rem">/// Event Delegate: How answering function must be?</span></pre> <pre class="alt"> <span class="rem">/// &lt;/summary&gt;</span></pre> <pre> <span class="rem">/// &lt;param name="text"&gt;&lt;/param&gt;</span></pre> <pre class="alt"> <span class="kwrd">public</span> <span class="kwrd">delegate</span> <span class="kwrd">void</span> dlgSubmitText(<span class="kwrd">string</span> text);</pre> <pre> </pre> <pre class="alt"> <span class="rem">/// &lt;summary&gt;</span></pre> <pre> <span class="rem">/// Evant object refearing to dlgSubmitText</span></pre> <pre class="alt"> <span class="rem">/// &lt;/summary&gt;</span></pre> <pre> <span class="kwrd">public</span> <span class="kwrd">event</span> dlgSubmitText SubmitText;</pre> </div> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p> </p> <p>In pratica abbiamo detto che nel nostro controllo esiste un evento la cui funzione di risposta ha un parametro di tipo stringa e non restisce valori. </p> <h3>Parte 2 - Invochiamo l'evento</h3> <p>Dobbiamo intercettare la pressione del pulsante interno al controllo in modo da poter generare l'evento.</p> <div class="csharpcode"> <pre class="alt"> <span class="kwrd">void</span> Btn_Click(<span class="kwrd">object</span> sender, EventArgs e)</pre> <pre> {</pre> <pre class="alt"> <span class="rem">//Retrive TextBox object</span></pre> <pre> TextBox Txt = (<span class="kwrd">this</span>.FindControl(<span class="str">"Txt"</span>) <span class="kwrd">as</span> TextBox);</pre> <pre class="alt"> </pre> <pre> <span class="rem">//Invoke Event with txt.text as parameter</span></pre> <pre class="alt"> <span class="rem">//!!! It's important to check if SubmitText is managed by (SubmitText != null) before to invoke event</span></pre> <pre> <span class="kwrd">if</span> (SubmitText != <span class="kwrd">null</span>){SubmitText.Invoke(Txt.Text);}</pre> <pre class="alt"> }</pre> </div> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p>E' molto importante ricordarsi l'if(SubmitText != null) perchè se l'evento non fosse gestito dal contenitore avremmo un'eccezione.</p> <h3>Parte 3 - Il controllo è pronto proviamolo:</h3> <p>Creiamo una pagina aspx per gestire il contollo ed il suo evento. Nel nostro caso quando intercettiamo l'evento scriviamo il testo che ci arriva come parametro in una label.</p> <p><u><strong>ASPX:</strong></u></p> <div class="csharpcode"> <pre class="alt"><span class="asp">&lt;%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %&gt;</span></pre> <pre><span class="asp">&lt;%@ Register Namespace="wmb" TagPrefix="wmb" %&gt;</span></pre> <pre class="alt"><span class="asp">&lt;%@ Register Src="~/MyAscxControl.ascx" TagPrefix="wmb" TagName="MyAscxControl" %&gt;</span></pre> <pre><span class="kwrd">&lt;!</span><span class="html">DOCTYPE</span> <span class="attr">html</span> <span class="attr">PUBLIC</span> <span class="kwrd">"-//W3C//DTD XHTML 1.0 Transitional//EN"</span> <span class="kwrd">"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</span><span class="kwrd">&gt;</span></pre> <pre class="alt"> </pre> <pre><span class="kwrd">&lt;</span><span class="html">html</span> <span class="attr">xmlns</span><span class="kwrd">="http://www.w3.org/1999/xhtml"</span><span class="kwrd">&gt;</span></pre> <pre class="alt"><span class="kwrd">&lt;</span><span class="html">head</span> <span class="attr">runat</span><span class="kwrd">="server"</span><span class="kwrd">&gt;</span></pre> <pre> <span class="kwrd">&lt;</span><span class="html">title</span><span class="kwrd">&gt;</span>Untitled Page<span class="kwrd">&lt;/</span><span class="html">title</span><span class="kwrd">&gt;</span></pre> <pre class="alt"><span class="kwrd">&lt;/</span><span class="html">head</span><span class="kwrd">&gt;</span></pre> <pre><span class="kwrd">&lt;</span><span class="html">body</span><span class="kwrd">&gt;</span></pre> <pre class="alt"> <span class="kwrd">&lt;</span><span class="html">form</span> <span class="attr">id</span><span class="kwrd">="form1"</span> <span class="attr">runat</span><span class="kwrd">="server"</span><span class="kwrd">&gt;</span></pre> <pre> <span class="kwrd">&lt;</span><span class="html">div</span><span class="kwrd">&gt;</span></pre> <pre class="alt"> <span class="kwrd">&lt;</span><span class="html">wmb:MyControl</span> <span class="attr">id</span><span class="kwrd">="MyControl"</span> <span class="attr">runat</span><span class="kwrd">="Server"</span> <span class="attr">OnSubmitText</span><span class="kwrd">="MyControl_SubmitText"</span><span class="kwrd">&gt;&lt;/</span><span class="html">wmb:MyControl</span><span class="kwrd">&gt;&lt;</span><span class="html">br</span> <span class="kwrd">/&gt;</span></pre> <pre> <span class="kwrd">&lt;</span><span class="html">wmb:MyAscxControl</span> <span class="attr">ID</span><span class="kwrd">="AscxControl"</span> <span class="attr">runat</span><span class="kwrd">="server"</span> <span class="attr">OnSubmitText</span><span class="kwrd">="AscxControl_SubmitText"</span> <span class="kwrd">/&gt;&lt;</span><span class="html">br</span> <span class="kwrd">/&gt;</span></pre> <pre class="alt"> <span class="kwrd">&lt;</span><span class="html">br</span> <span class="kwrd">/&gt;</span></pre> <pre> <span class="kwrd">&lt;</span><span class="html">asp:Label</span> <span class="attr">ID</span><span class="kwrd">="lblResult"</span> <span class="attr">runat</span><span class="kwrd">="server"</span><span class="kwrd">&gt;&lt;/</span><span class="html">asp:Label</span><span class="kwrd">&gt;</span></pre> <pre class="alt"> <span class="kwrd">&lt;/</span><span class="html">div</span><span class="kwrd">&gt;</span></pre> <pre> <span class="kwrd">&lt;/</span><span class="html">form</span><span class="kwrd">&gt;</span></pre> <pre class="alt"><span class="kwrd">&lt;/</span><span class="html">body</span><span class="kwrd">&gt;</span></pre> <pre><span class="kwrd">&lt;/</span><span class="html">html</span><span class="kwrd">&gt;</span></pre> </div> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p><u><strong>CS:</strong></u></p> <div class="csharpcode"> <pre class="alt"><span class="kwrd">public</span> <span class="kwrd">partial</span> <span class="kwrd">class</span> _Default : System.Web.UI.Page </pre> <pre>{</pre> <pre class="alt"> <span class="rem">/// &lt;summary&gt;</span></pre> <pre> <span class="rem">/// Custom event Managment (Server Control)</span></pre> <pre class="alt"> <span class="rem">/// &lt;/summary&gt;</span></pre> <pre> <span class="rem">/// &lt;param name="text"&gt;&lt;/param&gt;</span></pre> <pre class="alt"> <span class="kwrd">public</span> <span class="kwrd">void</span> MyControl_SubmitText(<span class="kwrd">string</span> text)</pre> <pre> {</pre> <pre class="alt"> lblResult.Text = <span class="str">"Server Event Text:"</span> + text;</pre> <pre> }</pre> <pre class="alt"> </pre> <pre> <span class="rem">/// &lt;summary&gt;</span></pre> <pre class="alt"> <span class="rem">/// Custom event Managment (Ascx Control)</span></pre> <pre> <span class="rem">/// &lt;/summary&gt;</span></pre> <pre class="alt"> <span class="rem">/// &lt;param name="text"&gt;&lt;/param&gt;</span></pre> <pre> <span class="kwrd">public</span> <span class="kwrd">void</span> AscxControl_SubmitText(<span class="kwrd">string</span> text)</pre> <pre class="alt"> {</pre> <pre> lblResult.Text = <span class="str">"ASCX Event Text:"</span> + text;</pre> <pre class="alt"> }</pre> <pre>}</pre> </div> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <h3></h3> <h3>Conclusioni e Sorgente:</h3> <p>Come avete potuto vedere il procedimento è molto semplice, flessibile ed offre grandi possibilità. </p> <p>Per ogni suggerimento su come migliorare quest'articolo, domande o altro scrivetemi pure.</p> <p> </p> <p><iframe style="border-right: #dde5e9 1px solid; padding-right: 0px; border-top: #dde5e9 1px solid; padding-left: 0px; padding-bottom: 0px; margin: 3px; border-left: #dde5e9 1px solid; width: 240px; padding-top: 0px; border-bottom: #dde5e9 1px solid; height: 66px; background-color: #ffffff" marginwidth="0" marginheight="0" src="http://cid-540ddf7934ea63ba.skydrive.live.com/embedrowdetail.aspx/Codice%20Articoli/CustomEventAndCustomControl.zip" frameborder="0" scrolling="no"></iframe></p> <p> </p> <p> </p><div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:944158bb-3f8e-44e0-a22d-3cbf09915527" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati Tag: <a href="http://technorati.com/tags/ASP.NET" rel="tag">ASP.NET</a>,<a href="http://technorati.com/tags/Custom%20Control" rel="tag">Custom Control</a>,<a href="http://technorati.com/tags/Server%20Control" rel="tag">Server Control</a>,<a href="http://technorati.com/tags/Event" rel="tag">Event</a></div><img src="http://blogs.ugidotnet.org/WamBlog/aggbug/92790.aspx" width="1" height="1" /> Diego Martelli http://blogs.ugidotnet.org/WamBlog/archive/2008/05/24/custom-event-in-custom-control.aspx Sat, 24 May 2008 11:00:56 GMT http://blogs.ugidotnet.org/WamBlog/archive/2008/05/24/custom-event-in-custom-control.aspx#feedback 2 http://blogs.ugidotnet.org/WamBlog/comments/commentRss/92790.aspx http://blogs.ugidotnet.org/WamBlog/services/trackbacks/92790.aspx TextBox come visualizzatori di informazioni ASP.NET http://blogs.ugidotnet.org/WamBlog/archive/2008/05/18/textbox-come-visualizzatori-di-informazioni.aspx <p>Spesso utiliziamo i <strong>textbox come semplici visualizzatori di informazioni</strong> inserite dall'utente in qualche altro modo. Pensa ad un calendario in cui selezionaniamo una data oppure ad una popup di input. Non volendo che l'utente possa inserire manualmente informazioni nella textbox settiamo l'attributo <strong>ReadOnly="True"</strong> oppure <strong>Enable="false"</strong>, ma se vogliamo leggere questo valore lato server abbiamo una brutta sorpresa: <strong>il valore non è stato modificato</strong>. </p> <p>Creaiamo un esempio abbastanza semplice:</p> <p><strong>Default.aspx</strong></p> <div class="csharpcode"> <pre class="alt"><span class="kwrd">&lt;</span><span class="html">html</span> <span class="attr">xmlns</span><span class="kwrd">="http://www.w3.org/1999/xhtml"</span><span class="kwrd">&gt;</span></pre> <pre><span class="kwrd">&lt;</span><span class="html">head</span> <span class="attr">runat</span><span class="kwrd">="server"</span><span class="kwrd">&gt;</span></pre> <pre class="alt"> <span class="kwrd">&lt;</span><span class="html">title</span><span class="kwrd">&gt;</span>Untitled Page<span class="kwrd">&lt;/</span><span class="html">title</span><span class="kwrd">&gt;</span></pre> <pre> <span class="kwrd">&lt;</span><span class="html">script</span> <span class="attr">type</span><span class="kwrd">="text/javascript"</span><span class="kwrd">&gt;</span></pre> <pre class="alt"> <span class="kwrd">function</span> InsertNewValue()</pre> <pre> {</pre> <pre class="alt"> <span class="kwrd">var</span> answer=prompt(<span class="str">"Inserisci il nuovo valore"</span>, <span class="str">"Nuovo Valore"</span>);</pre> <pre> document.getElementById(<span class="str">"txtNormale"</span>).value = answer;</pre> <pre class="alt"> document.getElementById(<span class="str">"txtReadOnly"</span>).value = answer;</pre> <pre> document.getElementById(<span class="str">"txtReadOnlyAddAttribute"</span>).value = answer;</pre> <pre class="alt"> }</pre> <pre> <span class="kwrd">&lt;/</span><span class="html">script</span><span class="kwrd">&gt;</span></pre> <pre class="alt"><span class="kwrd">&lt;/</span><span class="html">head</span><span class="kwrd">&gt;</span></pre> <pre><span class="kwrd">&lt;</span><span class="html">body</span><span class="kwrd">&gt;</span></pre> <pre class="alt"> <span class="kwrd">&lt;</span><span class="html">form</span> <span class="attr">id</span><span class="kwrd">="form1"</span> <span class="attr">runat</span><span class="kwrd">="server"</span><span class="kwrd">&gt;</span></pre> <pre> <span class="kwrd">&lt;</span><span class="html">div</span><span class="kwrd">&gt;</span></pre> <pre class="alt"> Textbox Normale:<span class="kwrd">&lt;</span><span class="html">asp:TextBox</span> <span class="attr">ID</span><span class="kwrd">="txtNormale"</span> <span class="attr">runat</span><span class="kwrd">="server"</span> <span class="attr">Text</span><span class="kwrd">="Valore originale"</span><span class="kwrd">&gt;&lt;/</span><span class="html">asp:TextBox</span><span class="kwrd">&gt;&lt;</span><span class="html">br</span> <span class="kwrd">/&gt;</span></pre> <pre> TextBox con ReadOnly:<span class="kwrd">&lt;</span><span class="html">asp:TextBox</span> <span class="attr">ID</span><span class="kwrd">="txtReadOnly"</span> <span class="attr">runat</span><span class="kwrd">="server"</span> <span class="attr">Text</span><span class="kwrd">="Valore originale"</span> <span class="attr">Readonly</span><span class="kwrd">="true"</span><span class="kwrd">&gt;&lt;/</span><span class="html">asp:TextBox</span><span class="kwrd">&gt;&lt;</span><span class="html">br</span> <span class="kwrd">/&gt;</span></pre> <pre class="alt"> TextBox con Add Attribute ReadOnly<span class="kwrd">&lt;</span><span class="html">asp:TextBox</span> <span class="attr">ID</span><span class="kwrd">="txtReadOnlyAddAttribute"</span> <span class="attr">runat</span><span class="kwrd">="server"</span> <span class="attr">Text</span><span class="kwrd">="Valore originale"</span><span class="kwrd">&gt;&lt;/</span><span class="html">asp:TextBox</span><span class="kwrd">&gt;&lt;</span><span class="html">br</span> <span class="kwrd">/&gt;</span></pre> <pre> <span class="kwrd">&lt;</span><span class="html">input</span> <span class="attr">value</span><span class="kwrd">="Modifica"</span> <span class="attr">type</span><span class="kwrd">="button"</span> <span class="attr">onclick</span><span class="kwrd">="InsertNewValue();"</span> <span class="kwrd">/&gt;&lt;</span><span class="html">br</span> <span class="kwrd">/&gt;</span></pre> <pre class="alt"> <span class="kwrd">&lt;</span><span class="html">asp:Button</span> <span class="attr">ID</span><span class="kwrd">="btnPostBack"</span> <span class="attr">runat</span><span class="kwrd">="server"</span> <span class="attr">Text</span><span class="kwrd">="DoPostBack"</span> <span class="kwrd">/&gt;&lt;</span><span class="html">br</span> <span class="kwrd">/&gt;</span></pre> <pre> <span class="kwrd">&lt;</span><span class="html">asp:Label</span> <span class="attr">ID</span><span class="kwrd">="lblResult"</span> <span class="attr">Text</span><span class="kwrd">=""</span> <span class="attr">runat</span><span class="kwrd">="server"</span><span class="kwrd">&gt;&lt;/</span><span class="html">asp:Label</span><span class="kwrd">&gt;</span></pre> <pre class="alt"> <span class="kwrd">&lt;/</span><span class="html">div</span><span class="kwrd">&gt;</span></pre> <pre> <span class="kwrd">&lt;/</span><span class="html">form</span><span class="kwrd">&gt;</span></pre> <pre class="alt"><span class="kwrd">&lt;/</span><span class="html">body</span><span class="kwrd">&gt;</span></pre> <pre><span class="kwrd">&lt;/</span><span class="html">html</span><span class="kwrd">&gt;</span></pre> </div> <p><strong>Default.aspx.cs</strong></p> <div class="csharpcode"> <pre class="alt"><span class="lnum"> 1: </span><span class="kwrd">public</span> <span class="kwrd">partial</span> <span class="kwrd">class</span> _Default : System.Web.UI.Page </pre> <pre><span class="lnum"> 2: </span>{</pre> <pre class="alt"><span class="lnum"> 3: </span> <span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> OnInit(EventArgs e)</pre> <pre><span class="lnum"> 4: </span> {</pre> <pre class="alt"><span class="lnum"> 5: </span> <span class="kwrd">base</span>.OnInit(e);</pre> <pre><span class="lnum"> 6: </span> btnPostBack.Click += <span class="kwrd">new</span> EventHandler(btnPostBack_Click);<span class="rem">//Agganciare l'evento del pulsante</span></pre> <pre class="alt"><span class="lnum"> 7: </span> <span class="rem">//txtReadOnlyAddAttribute.Attributes.Add("disabled", "disabled");</span></pre> <pre><span class="lnum"> 8: </span> txtReadOnlyAddAttribute.Attributes.Add(<span class="str">"readonly"</span>, <span class="str">"readonly"</span>);</pre> <pre class="alt"><span class="lnum"> 9: </span> }</pre> <pre><span class="lnum"> 10: </span> </pre> <pre class="alt"><span class="lnum"> 11: </span> <span class="kwrd">void</span> btnPostBack_Click(<span class="kwrd">object</span> sender, EventArgs e)</pre> <pre><span class="lnum"> 12: </span> {</pre> <pre class="alt"><span class="lnum"> 13: </span> <span class="kwrd">string</span> lblTest = <span class="str">@"Risultati inseriti:&lt;br/&gt;</span></pre> <pre><span class="lnum"> 14: </span> <span class="str">txtNormale = '{0}'&lt;br/&gt;</span> </pre> <pre class="alt"><span class="lnum"> 15: </span> <span class="str">txtReadOnly = '{1}'&lt;br/&gt;</span></pre> <pre><span class="lnum"> 16: </span> <span class="str">txtReadOnlyAddAttribute = '{2}'&lt;br/&gt;</span></pre> <pre class="alt"><span class="lnum"> 17: </span> <span class="str">"</span>;</pre> <pre><span class="lnum"> 18: </span> lblResult.Text = <span class="kwrd">string</span>.Format(lblTest, txtNormale.Text, txtReadOnly.Text, txtReadOnlyAddAttribute.Text);</pre> <pre class="alt"><span class="lnum"> 19: </span> }</pre> <pre><span class="lnum"> 20: </span>}</pre> </div> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p>Abbiamo 3 TextBox che vengono modificate assieme dalla funzione Javascript <em>InsertNewValue</em> con un semplice prompt alla pressione di "Modifica". In più abbiamo un pulsante che esegue il postback e scrive i 3 valori modificati in una label. La prima textbox serve per vedere il comportamento standard, la secoda il comportamento con readonly attivo ed infine la soluzione al problema.</p> <p>Modificando il valore  ed eseguendo l postback otteniamo questo risultato:</p> <blockquote> <p><font color="#0000ff">Risultati inserito: <br />txtNormale = 'Nuovo Valore' <br />txtReadOnly = 'Valore originale' <br />txtReadOnlyAddAttribute = 'Nuovo Valore'</font></p> </blockquote> <h3></h3> <h4><strong>Spiegazione:</strong></h4> <p>Perchè otteniamo questa differenza? Perchè l'uso dell'Attributes.Add(string, string) inserisce l'attributo così com'è nel tag html, ma non influenza in nessun modo il controllo server. L'attributo Readonly invece cambia il comportamento del controllo che ignora le modifiche perchè è "readonly".</p> <h3><strong>Nota su Disable:</strong></h3> <p>L'attributo "disable" <u>non</u> funziona come readonly: Il valore infatti non subisce modifiche. Per fare una prova commentate la riga 8 e decommentate la riga 7.</p> <h3>Scarica il Codice dell'Esempio:</h3> <iframe style="border-right: #dde5e9 1px solid; padding-right: 0px; border-top: #dde5e9 1px solid; padding-left: 0px; padding-bottom: 0px; margin: 3px; border-left: #dde5e9 1px solid; width: 240px; padding-top: 0px; border-bottom: #dde5e9 1px solid; height: 66px; background-color: #ffffff" marginwidth="0" marginheight="0" src="http://cid-540ddf7934ea63ba.skydrive.live.com/embedrowdetail.aspx/Codice%20Articoli/ArticoloTextBoxReadOnlyCode.rar" frameborder="0" scrolling="no"></iframe> <p>  </p><div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:a878db6b-2990-4cd9-b25f-59d7b57ad3d6" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati Tag: <a href="http://technorati.com/tags/ASP.NET" rel="tag">ASP.NET</a></div><img src="http://blogs.ugidotnet.org/WamBlog/aggbug/92721.aspx" width="1" height="1" /> Diego Martelli http://blogs.ugidotnet.org/WamBlog/archive/2008/05/18/textbox-come-visualizzatori-di-informazioni.aspx Sun, 18 May 2008 12:18:38 GMT http://blogs.ugidotnet.org/WamBlog/archive/2008/05/18/textbox-come-visualizzatori-di-informazioni.aspx#feedback 1 http://blogs.ugidotnet.org/WamBlog/comments/commentRss/92721.aspx http://blogs.ugidotnet.org/WamBlog/services/trackbacks/92721.aspx Le dimensioni sono importanti! Javascript http://blogs.ugidotnet.org/WamBlog/archive/2008/05/15/le-dimnsioni-sono-importanti.aspx <p>Spesso ho bisogno di sapere qual'è la superficie del browser: non la dimensione della finiestra ma l'area effettivamente utilizzabile (esclusi menu barre di scorrimento e altro).</p> <p>Ho trovato un ottimo articolo di <font face="Arial">Stephen Chapman in cui parla proprio di questo e chiude con un bel codice da riutilizzare! Godetevelo :</font></p> <ul> <li><font face="Arial">Articolo: <font face="Arial"><a href="http://javascript.about.com/od/guidesscriptindex/a/screen.htm">http://javascript.about.com/od/guidesscriptindex/a/screen.htm</a></font></font> </li> <li>Esempio: <font face="Arial">http://javascript.about.com/library/blscreen1.htm</font> </li> <li>Codice: <font face="Arial"><a href="http://javascript.about.com/library/blscreen2.htm">http://javascript.about.com/library/blscreen2.htm</a></font> </li> </ul> <p>Ah dimenticavo, sempre per gestire le dimensioni provate <a href="http://www.iconico.com/caliper/">questo calibro da monitor</a>, io mi trovo benissimo (se avete suggerimenti su altri strumenti di questo tipo dite pure).</p><img src="http://blogs.ugidotnet.org/WamBlog/aggbug/92680.aspx" width="1" height="1" /> Diego Martelli http://blogs.ugidotnet.org/WamBlog/archive/2008/05/15/le-dimnsioni-sono-importanti.aspx Thu, 15 May 2008 14:22:59 GMT http://blogs.ugidotnet.org/WamBlog/archive/2008/05/15/le-dimnsioni-sono-importanti.aspx#feedback 1 http://blogs.ugidotnet.org/WamBlog/comments/commentRss/92680.aspx http://blogs.ugidotnet.org/WamBlog/services/trackbacks/92680.aspx [OT] - Connessione ADSL http://blogs.ugidotnet.org/WamBlog/archive/2008/05/14/ot---connessione-adsl.aspx Non ci posso credere, dopo anni di tentativi infruttosi con Telecom, Libero e molti altri. Dopo decine di ore spese ad aspettare inutilmente ai callcenter. Ho l'ADSL a casa. Per tutto questo ringrazio NGI (giuro non mi danno commissioni) e Elio Tondo il mio caro expresidente che me l'ha suggerita!<br /> Ed ora a noi due internet!<br /> <img src="/Providers/BlogEntryEditor/FCKeditor/editor/images/smiley/msn/teeth_smile.gif" alt="" /><img src="/Providers/BlogEntryEditor/FCKeditor/editor/images/smiley/msn/teeth_smile.gif" alt="" /><img src="/Providers/BlogEntryEditor/FCKeditor/editor/images/smiley/msn/teeth_smile.gif" alt="" /><img src="/Providers/BlogEntryEditor/FCKeditor/editor/images/smiley/msn/teeth_smile.gif" alt="" /><img src="/Providers/BlogEntryEditor/FCKeditor/editor/images/smiley/msn/teeth_smile.gif" alt="" /><img src="/Providers/BlogEntryEditor/FCKeditor/editor/images/smiley/msn/teeth_smile.gif" alt="" /><img src="/Providers/BlogEntryEditor/FCKeditor/editor/images/smiley/msn/teeth_smile.gif" alt="" /><img src="/Providers/BlogEntryEditor/FCKeditor/editor/images/smiley/msn/teeth_smile.gif" alt="" /><img src="/Providers/BlogEntryEditor/FCKeditor/editor/images/smiley/msn/teeth_smile.gif" alt="" /><img src="/Providers/BlogEntryEditor/FCKeditor/editor/images/smiley/msn/teeth_smile.gif" alt="" /><img src="/Providers/BlogEntryEditor/FCKeditor/editor/images/smiley/msn/teeth_smile.gif" alt="" /><img src="/Providers/BlogEntryEditor/FCKeditor/editor/images/smiley/msn/teeth_smile.gif" alt="" /><br /> (un Wamba gongolante, moolto gongolante)<img src="http://blogs.ugidotnet.org/WamBlog/aggbug/92659.aspx" width="1" height="1" /> Diego Martelli http://blogs.ugidotnet.org/WamBlog/archive/2008/05/14/ot---connessione-adsl.aspx Wed, 14 May 2008 02:22:13 GMT http://blogs.ugidotnet.org/WamBlog/archive/2008/05/14/ot---connessione-adsl.aspx#feedback 9 http://blogs.ugidotnet.org/WamBlog/comments/commentRss/92659.aspx http://blogs.ugidotnet.org/WamBlog/services/trackbacks/92659.aspx Classi abstract e interfacce C# http://blogs.ugidotnet.org/WamBlog/archive/2008/04/25/classi-abstract-e-interfacce-again.aspx <p>Oggi sul forum di ASP.NET ho risposto ad un post che mi è sembrato interessante, ed ho deciso di riproporlo come post.</p> <p>"Ho una classe di base abstract B1 e un inrefaccia I1. Creo un'altra classe abstract B2 che eredita da B1 ed implementa I1. Infine ho due classi D1 e D2 che ereditano da B2. Dichiarando un metodo in I1 e volendolo implementare solo in D1 e D2, come posso fare? "</p> <p align="right"><a href="http://blogs.ugidotnet.org/WamBlog/archive/2008/04/24/classi-abstract-e-interfacce.aspx">Continua e soluzione</a></p><img src="http://blogs.ugidotnet.org/WamBlog/aggbug/92371.aspx" width="1" height="1" /> Diego Martelli http://blogs.ugidotnet.org/WamBlog/archive/2008/04/25/classi-abstract-e-interfacce-again.aspx Fri, 25 Apr 2008 00:10:16 GMT http://blogs.ugidotnet.org/WamBlog/archive/2008/04/25/classi-abstract-e-interfacce-again.aspx#feedback 2 http://blogs.ugidotnet.org/WamBlog/comments/commentRss/92371.aspx http://blogs.ugidotnet.org/WamBlog/services/trackbacks/92371.aspx Triplet ASP.NET http://blogs.ugidotnet.org/WamBlog/archive/2008/04/22/triplet.aspx <p><font face="Arial">Ho scoperto di recente la classe <a href="http://msdn2.microsoft.com/it-it/library/system.web.ui.triplet.aspx">triplet</a> . </font></p> <p><font face="Arial">Non sono un architetto, ma mi ha lasciato molto perplesso. Che senso ha? Perchè non crearsi una classe personalizzata? Mi piacerebbe sapere le vostre impressioni.</font></p><img src="http://blogs.ugidotnet.org/WamBlog/aggbug/92319.aspx" width="1" height="1" /> Diego Martelli http://blogs.ugidotnet.org/WamBlog/archive/2008/04/22/triplet.aspx Tue, 22 Apr 2008 15:27:52 GMT http://blogs.ugidotnet.org/WamBlog/archive/2008/04/22/triplet.aspx#feedback 3 http://blogs.ugidotnet.org/WamBlog/comments/commentRss/92319.aspx http://blogs.ugidotnet.org/WamBlog/services/trackbacks/92319.aspx Image button - Lo sfondo ASP.NET http://blogs.ugidotnet.org/WamBlog/archive/2008/01/27/image-button---lo-sfondo.aspx Utilizzando gli imagebutton mi sono scontrato spesso con la trasparenza dell'immagine.<br /> L'imagebutton usa il bianco come colore di sfondo e l'effetto grafico non è certo entusiasmante. Per correggere questo difetto basta utilizzare l'attributo BackColor settato a "Transparent" e il pulsante rispetterà le trasparenze dell'immagine.<img src="http://blogs.ugidotnet.org/WamBlog/aggbug/90882.aspx" width="1" height="1" /> Diego Martelli http://blogs.ugidotnet.org/WamBlog/archive/2008/01/27/image-button---lo-sfondo.aspx Sun, 27 Jan 2008 13:28:01 GMT http://blogs.ugidotnet.org/WamBlog/archive/2008/01/27/image-button---lo-sfondo.aspx#feedback 7 http://blogs.ugidotnet.org/WamBlog/comments/commentRss/90882.aspx http://blogs.ugidotnet.org/WamBlog/services/trackbacks/90882.aspx