<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.devland.it/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Marco del Gatto - web development tips &amp;amp; tricks</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/default.aspx</link><description>Consigli, trucchi, scoperte per programmatori di siti web</description><dc:language>it</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>Intercettare il refresh di un ASP.NET UpdatePanel in javascript</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2011/11/06/intercettare-il-refresh-di-un-asp-net-updatepanel-in-javascript.aspx</link><pubDate>Sun, 06 Nov 2011 14:04:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:845</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>0</slash:comments><comments>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2011/11/06/intercettare-il-refresh-di-un-asp-net-updatepanel-in-javascript.aspx#comments</comments><description>
&lt;p&gt;Può essere molto utile intercettare il refresh di un ASP.NET UpdatePanel in javascript ad esempio per reinizializzare dei listener di jQuery su oggetti del DOM che si sono modificati durante il refresh stesso.&lt;/p&gt;
&lt;p&gt;Per farlo è sufficiente registrarsi all&amp;#39;evento add_pageLoaded del PageRequestManager ed offrirgli una callback, come in questo esempio:

&lt;/p&gt;
&lt;div class="codice"&gt;

&lt;p&gt;&amp;nbsp;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(document).ready(function () {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(FaiQualcosa);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function FaiQualcosa() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ......&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;lt;/script&amp;gt; &lt;br /&gt;&lt;/p&gt;

&lt;/div&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=845" width="1" height="1"&gt;</description></item><item><title>CSS: Agganciare il footer a fondo pagina</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2010/10/13/css-agganciare-il-footer-a-fondo-pagina.aspx</link><pubDate>Wed, 13 Oct 2010 14:10:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:695</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>0</slash:comments><comments>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2010/10/13/css-agganciare-il-footer-a-fondo-pagina.aspx#comments</comments><description>&lt;p&gt;Quella che dovrebbe essere una banalità non lo è affatto: agganciare un footer a fondo pagina in modo tale che sia in grado di &amp;quot;scendere&amp;quot; qualora ci sia molto testo&amp;nbsp;e di starsene lì in fondo se ce ne è&amp;nbsp;poco.&lt;/p&gt;
&lt;p&gt;Chi ci ha provato lo sa :)&lt;/p&gt;
&lt;p&gt;Vi segnalo la&amp;nbsp;migliore soluzione che ho trovato fino ad ora e che fa uso di solo css (no javascript):&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.cssstickyfooter.com/"&gt;http://www.cssstickyfooter.com/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=695" width="1" height="1"&gt;</description><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/css/default.aspx">css</category></item><item><title>Funzione JQuery per inserire testo alla posizione del cursore di una textarea</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2010/09/14/funzione-jquery-per-inserire-testo-alla-posizione-del-cursore-di-una-textarea.aspx</link><pubDate>Tue, 14 Sep 2010 09:15:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:663</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>0</slash:comments><comments>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2010/09/14/funzione-jquery-per-inserire-testo-alla-posizione-del-cursore-di-una-textarea.aspx#comments</comments><description>&lt;p&gt;Per inserire via javascript del testo alla posizione corrente del cursore di una textarea, Explorer e Firefox necessitano di sintassi differenziate.&lt;/p&gt;
&lt;p&gt;Al fine di semplificarci la vita possiamo usare questo plugin di jquery:&lt;/p&gt;
&lt;div class="codice"&gt;
&lt;p&gt;$.fn.insertAtCaret = function (myValue) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return this.each(function () {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //IE&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (document.selection) {&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; this.focus();&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; sel = document.selection.createRange();&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; sel.text = myValue;&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; this.focus();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //MOZILLA&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (this.selectionStart || this.selectionStart == &amp;#39;0&amp;#39;) {&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; var startPos = this.selectionStart;&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; var endPos = this.selectionEnd;&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; var scrollTop = this.scrollTop;&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; this.value = this.value.substring(0, startPos) + myValue + this.value.substring(endPos, this.value.length);&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; this.focus();&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; this.selectionStart = startPos + myValue.length;&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; this.selectionEnd = startPos + myValue.length;&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; this.scrollTop = scrollTop;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&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; this.value += myValue;&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; this.focus();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;};&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Una volta referenziato jquery e la funzione precedente, nel codice applicativo è sufficiente scrivere:&lt;/p&gt;
&lt;div class="codice"&gt;
&lt;p&gt;$(&amp;quot;&amp;lt;selettore&amp;gt;&amp;quot;). insertAtCaret(&amp;quot;testo da inserire&amp;quot;);&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=663" width="1" height="1"&gt;</description></item><item><title>L’objectdatasource ignora la cultura quando aggiorna un business object</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2010/09/10/l-objectdatasource-ignora-la-cultura-quando-aggiorna-un-business-object.aspx</link><pubDate>Fri, 10 Sep 2010 12:18:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:657</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>1</slash:comments><comments>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2010/09/10/l-objectdatasource-ignora-la-cultura-quando-aggiorna-un-business-object.aspx#comments</comments><description>&lt;p&gt;Se state usando un objectdatasource agganciato ad un vostro adapter custom, potreste incorrere in spiacevoli incovenienti quando si tratta aggiornare delle proprietà sensibili alla cultura (es: campi&amp;nbsp; DateTime).&lt;/p&gt;&lt;p&gt;Quello che succede è che benché l’interfaccia utente possiate averla impostata in una certa cultura – es: italiano – l’objectdatasource quando raccoglie i dati dai controlli tenta di convertirli usando la cultura invariante, generando errori tipo:&lt;/p&gt;
&lt;div class="codice"&gt;Cannot convert value of parameter XXX from &amp;#39;System.String&amp;#39; to &amp;#39;System.DateTime&amp;#39;&lt;/div&gt;
&lt;p&gt;Il workaround è semplice: basta specificare esplicitamente I parametri sensibili alla cultura nella definizione dell’objectdatasource (cosa che normalmente è opzionale utilizzando un business object) ad esempio:&lt;/p&gt;
&lt;div class="codice"&gt;&amp;lt;InsertParameters&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Parameter Name=&amp;quot;PublishedFrom&amp;quot; Type=&amp;quot;DateTime&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Parameter Name=&amp;quot;PublishedTo&amp;quot; Type=&amp;quot;DateTime&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/InsertParameters&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;UpdateParameters&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Parameter Name=&amp;quot;PublishedFrom&amp;quot; Type=&amp;quot;DateTime&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Parameter Name=&amp;quot;PublishedTo&amp;quot; Type=&amp;quot;DateTime&amp;quot; /&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/UpdateParameters&amp;gt;&lt;/div&gt;
&lt;p&gt;In questo modo, per qualche oscura ragione, l’objectdatasource effettua correttamente le conversioni.&lt;/p&gt;
&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=657" width="1" height="1"&gt;</description><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/sviluppo/default.aspx">sviluppo</category><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>Errore nel rendering dell'attributo Scope di TableHeaderCell in ASP.NET</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2010/08/04/errore-nel-rendering-dell-attributo-scope-di-tableheadercell-in-asp-net.aspx</link><pubDate>Wed, 04 Aug 2010 10:06:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:627</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>0</slash:comments><comments>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2010/08/04/errore-nel-rendering-dell-attributo-scope-di-tableheadercell-in-asp-net.aspx#comments</comments><description>&lt;p&gt;Se manipolate un oggetto Table lato server in ASP.NET costruendo dinamicamente righe e colonne, state attenti all&amp;#39;attributo Scope dell&amp;#39;oggetto TableHeaderCell.&lt;/p&gt;
&lt;p&gt;Tale enum ci permette di configurare lo scope del th a scelta tra &amp;quot;Column&amp;quot; e &amp;quot;Row&amp;quot;; il primo dei due elementi dell&amp;#39;enum (Column) si renderizza però in modo errato, creando il seguente markup:&lt;/p&gt;
&lt;div class="codice"&gt;&amp;lt;th scope=&amp;quot;column&amp;quot;&amp;gt;...&lt;/div&gt;&lt;br /&gt;invece che: 
&lt;div class="codice"&gt;&amp;lt;th scope=&amp;quot;col&amp;quot;&amp;gt;...&lt;/div&gt;
&lt;p&gt;come è previsto dal W3C (&lt;a href="http://www.w3.org/TR/html401/struct/tables.html#h-11.2.4"&gt;http://www.w3.org/TR/html401/struct/tables.html#h-11.2.4&lt;/a&gt; )&lt;br /&gt;Per ovviare al problema l’unico workaround è creare un attributo generico sul TableHeaderCell.&lt;/p&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=627" width="1" height="1"&gt;</description></item><item><title>Page.ValidateRequest nel porting ad ASP.NET 4.0</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2010/05/04/page-validaterequest-nel-porting-ad-asp-net-4-0.aspx</link><pubDate>Tue, 04 May 2010 18:36:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:582</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>2</slash:comments><comments>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2010/05/04/page-validaterequest-nel-porting-ad-asp-net-4-0.aspx#comments</comments><description>&lt;div&gt;Se state effettuando il porting ad ASP.NET 4.0 di applicazioni realizzate con un framework precedente, potreste trovarvi una sorpresa: le pagine nelle quali avete disabiliato la validazione automatica della request (perchè magari avete un editor html o simili) nonostante la direttiva ValidateRequest=&amp;quot;false&amp;quot; continueranno a validare la richiesta.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Per ovviare all&amp;#39;inconveniente occorre impostare nel web.config la modalità compatibile con i framework precedenti, attraverso l&amp;#39;inserimento del seguente nodo dentro system.web: &lt;/div&gt;&lt;br /&gt;
&lt;div class="codice"&gt;&amp;lt;httpRuntime requestValidationMode=&amp;quot;2.0&amp;quot;/&amp;gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;In questo modo il runtime riprenderà a comportarsi come atteso, non validando la Request dove lo richiedete. &lt;/div&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=582" width="1" height="1"&gt;</description></item><item><title>Come evitare il Quirks Mode nei browser per siti web xthml strict</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2010/01/22/come-evitare-il-quirks-mode-nei-browser-per-siti-web-xthml-strict.aspx</link><pubDate>Fri, 22 Jan 2010 08:04:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:487</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>0</slash:comments><comments>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2010/01/22/come-evitare-il-quirks-mode-nei-browser-per-siti-web-xthml-strict.aspx#comments</comments><description>&lt;p&gt;Se – come si conviene - stiamo sviluppando un website adottando le specifiche XHTML Strict 1.0, risulta importante far sì che i browser degli utenti capiscano la nostra intenzione utilizzando lo Standard Mode e che non entrino quindi in Quirks Mode, la modalità “mangiatutto” utile per la renderizzazione dei web site di vecchia generazione ma che rischia di danneggiare sia il layout che le performance dei web site realizzati correttamente con i nuovi standard.&lt;/p&gt;
&lt;p&gt;Per fare questo, una volta che abbiamo validato il nostro documento e siamo certi di essere conformi agli standard, basta seguire questi 3 semplici passi:&lt;/p&gt;
&lt;p&gt;1 - Mettere il doctype con url COMPLETA al DTD: 
&lt;div class="codice"&gt;&lt;font face="Courier New"&gt;&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Strict//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&amp;quot;&amp;gt;&lt;/font&gt;&lt;/div&gt;
&lt;p&gt;2 – Specificare nel css principale che il TAG IMG è di tipo block (questo compensa l’Almost Standard Mode di Gecko): 
&lt;div class="codice"&gt;img{display:block;}&lt;/div&gt;
&lt;p&gt;3 – impedire agli utenti di IE8 di passare alla modalità compatibile mettendo la seguente direttiva nella head: 
&lt;div class="codice"&gt;&amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;IE=8&amp;quot; /&amp;gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=487" width="1" height="1"&gt;</description></item><item><title>Enum Mapping bug nel designer di LinqToSql</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2009/11/06/enum-mapping-bug-nel-designer-di-linqtosql.aspx</link><pubDate>Fri, 06 Nov 2009 13:31:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:410</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>0</slash:comments><comments>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2009/11/06/enum-mapping-bug-nel-designer-di-linqtosql.aspx#comments</comments><description>&lt;p&gt;Con LinqToSql è possibile mappare automaticamente i campi INT di SqlServer ai corrispondenti valori di un tipo enum C#.&lt;/p&gt;&lt;p&gt;Questo rappresenta una grande comodità nella scrittura del codice in quanto le classi autogenerate espongono la corrispondete proprietà tipizzata nell&amp;#39;enum scelto, evitando noisi passaggi di trascodifica.&lt;/p&gt;
&lt;p&gt;Tuttavia alle volte il designer genera dei messaggi di errore del tipo:&lt;/p&gt;
&lt;div class="codice"&gt;DBML1005: Mapping between DbType &amp;#39;Int&amp;#39; and Type &amp;#39;AnApp.AnEnum&amp;#39; in Column &amp;#39;EnumDBColumn&amp;#39; of Type &amp;#39;ATable&amp;#39; is not supported.&lt;/div&gt;
&lt;p&gt;Per aggirare il problema quando specificate il nome del tipo enum nella proprietà Type del designer anteponete il prefisso &amp;quot;global::&amp;quot;. &lt;/p&gt;
&lt;p&gt;Ad esempio se il nostro enum si chiama:&lt;/p&gt;
&lt;div class="codice"&gt;MioProgetto.MioNamespace.MioEnum&lt;/div&gt;
&lt;p&gt;dichiaratelo come:&lt;/p&gt;
&lt;div class="codice"&gt;global::MioProgetto.MioNamespace.MioEnum&lt;/div&gt;&lt;br /&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=410" width="1" height="1"&gt;</description><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/sviluppo/default.aspx">sviluppo</category><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/.net/default.aspx">.net</category><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>Leggere i metadati di un file bitmap</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2009/04/19/leggere-i-metadati-di-un-file-bitmap.aspx</link><pubDate>Sun, 19 Apr 2009 07:23:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:309</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>0</slash:comments><comments>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2009/04/19/leggere-i-metadati-di-un-file-bitmap.aspx#comments</comments><description>&lt;p&gt;Mi è capitato di dover accedere da programma ai metadati (Keywords, Title, Rating, ecc)&amp;nbsp; impostati nei metadati di un insieme di file jpg; questi metadati possono essere impostati da qualsiasi programma di grafica o dal sistema operativo stesso.&lt;/p&gt;
&lt;p&gt;Il framework .NET ci mette a disposizione un modo semplice per accedere a queste informazioni. Innanzitutto è necessario referenziare le seguenti librerie:&lt;/p&gt;
&lt;div class="codice"&gt;PresentationCore&lt;br /&gt;WindowsBase&lt;/div&gt;
&lt;p&gt;Fatto questo l&amp;#39;accesso ai metadati è davvero semplice. Vi riporto nel seguito il codice di una console application in VB.NET che visualizza il Title e le Keywords letti da un jpg:&lt;/p&gt;
&lt;div class="codice"&gt;&lt;pre&gt;Imports System.Windows.Media.Imaging
Module Module1

    Sub Main()
        Dim decoder As New JpegBitmapDecoder(New Uri(&amp;quot;C:\tmp\immagine.jpg&amp;quot;), _
              BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad)
        Dim bitmap As BitmapMetadata = decoder.Frames(0).Metadata

        Console.WriteLine(bitmap.Title)
        Console.WriteLine(&amp;quot;------------------------------------&amp;quot;)
        For Each k In bitmap.Keywords
            Console.WriteLine(k)
        Next

        Console.ReadLine()
    End Sub

End Module
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Grazie a Marco Nava per il tip. &lt;/p&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=309" width="1" height="1"&gt;</description><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/.net/default.aspx">.net</category></item><item><title>Lunghezza stringhe JSON in ScriptServices di ASP.NET</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2009/03/31/lunghezza-stringhe-json-in-scriptservices-di-asp-net.aspx</link><pubDate>Tue, 31 Mar 2009 08:38:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:308</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>0</slash:comments><comments>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2009/03/31/lunghezza-stringhe-json-in-scriptservices-di-asp-net.aspx#comments</comments><description>&lt;p&gt;Se invocate WebServices via javascript attraverso gli ScriptServices dello ScriptManager di ASP.NET, potreste incorrere in un problema di lunghezza massima delle variabili di tipo stringa; il problema&amp;nbsp; è semplicemente dovuto ai default applicati dal framework (poco più di 500 caratteri) e non da una limitazione di JSON o di javascript.&lt;/p&gt;
&lt;p&gt;Per aumentare tale parametro è sufficiente agire come segue nel web.config:&lt;/p&gt;
&lt;div class="codice"&gt;&amp;lt;system.web.extensions&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;scripting&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;webServices&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;jsonSerialization maxJsonLength=&amp;quot;10000000&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/webServices&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;scriptResourceHandler enableCompression=&amp;quot;true&amp;quot; enableCaching=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/scripting&amp;gt;&lt;br /&gt;&amp;lt;/system.web.extensions&amp;gt; 
&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=308" width="1" height="1"&gt;</description><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/webservice/default.aspx">webservice</category><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/json/default.aspx">json</category><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/javascript/default.aspx">javascript</category></item><item><title>Oggetti COM ActiveX su IIS7 a 64bit</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2009/02/20/oggetti-com-activex-su-iis7-a-64bit.aspx</link><pubDate>Fri, 20 Feb 2009 09:13:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:301</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>0</slash:comments><comments>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2009/02/20/oggetti-com-activex-su-iis7-a-64bit.aspx#comments</comments><description>&lt;p&gt;Se state migrando delle applicazioni in Classic ASP che fanno uso di oggetti ActiveX COM su server Windows 2008 a 64 bit, potreste incappare nel classico errore:&lt;/p&gt;
&lt;br /&gt;
&lt;div class="codice"&gt;
ActiveX Component cannot create object
&lt;/div&gt;
&lt;br /&gt;
&lt;p&gt;Questo avviene perché per default l’esecuzione di codice legacy a 32 bit è disabilitato sugli application pool di iis7 a 64bit.&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;La soluzione è semplice: individuate l’application pool utilizzato dal sito web, andate negli Advanced Settings e impostate il flag &lt;b&gt;Enable 32bit Application&lt;/b&gt; a true.
&lt;/p&gt;
&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=301" width="1" height="1"&gt;</description><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/IIS7/default.aspx">IIS7</category><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/Classic+ASP/default.aspx">Classic ASP</category></item><item><title>Determinare se il testo di FCKEditor è logicamente nullo</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2008/12/18/determinare-se-il-testo-di-fckeditor-232-logicamente-nullo.aspx</link><pubDate>Thu, 18 Dec 2008 08:19:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:291</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>0</slash:comments><comments>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2008/12/18/determinare-se-il-testo-di-fckeditor-232-logicamente-nullo.aspx#comments</comments><description>&lt;p&gt;Se utilizzate l&amp;#39;ottimo &lt;a class="" title="FKCEditor" href="http://www.fckeditor.net/" target="_blank"&gt;FCKEditor&lt;/a&gt; all&amp;#39;interno delle vostre applicazioni, potrebbe capitarvi di avere la necessità di sapere se il testo inserito dall&amp;#39;utente è nullo da un punto di vista &amp;quot;logico&amp;quot;; infatti il controllo tende a inserire comunque dei tag invisibili (es: &amp;quot;&amp;amp;nbsp;&amp;quot;, ecc) che in caso di assenza di altro testo valido tendono a creare dei falsi positivi.&lt;/p&gt;
&lt;p&gt;Vi potrebbe essere utile questa ruotine che ho scritto che effettua una validazione custom dell&amp;#39;input:&lt;/p&gt;
&lt;div class="codice"&gt;&lt;pre&gt;public static bool IsFCKEditorTextEmpty(string value)
{

if (value == null) return true;

string input = value;
input = Regex.Replace(input, &amp;quot;&amp;lt;[^&amp;gt;]*&amp;gt;&amp;quot;, &amp;quot;&amp;quot;, RegexOptions.IgnoreCase);
input = Regex.Replace(input, @&amp;quot;&amp;amp;\w+;&amp;quot;, &amp;quot;&amp;quot;, RegexOptions.IgnoreCase);
input = input.Trim();

return input == &amp;quot;&amp;quot;;

}
&lt;/pre&gt;&lt;/div&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=291" width="1" height="1"&gt;</description><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/fckeditor/default.aspx">fckeditor</category></item><item><title>Selettori standard per la property grid per User e Custom Controls</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2008/09/12/selettori-standard-per-la-property-grid-di-visual-studio-per-user-e-custom-controls.aspx</link><pubDate>Fri, 12 Sep 2008 06:36:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:253</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>0</slash:comments><comments>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2008/09/12/selettori-standard-per-la-property-grid-di-visual-studio-per-user-e-custom-controls.aspx#comments</comments><description>&lt;p&gt;Se lavorate molto con User Controls o Custom Controls, avrete senz&amp;#39;altro la necessità di personalizzare il modo in cui le proprietà pubbliche di questi appaiono nella property grid di Visual Studio, onde evitare le limitazioni della classica casella di testo libera.&lt;/p&gt;
&lt;p&gt;Su suggerimento del mio amico Marco Nava, vi riporto una collezione degli attributi più usati per personalizzarle.&lt;/p&gt;
&lt;p&gt;Nota: gli attributi possono anche essere sommati tra di loro.&lt;/p&gt;
&lt;p&gt;Nota 2: gli attributi sono dichiarati in vari namespace/assembly, per sicurezza importate i seguenti:&lt;/p&gt;
&lt;div class="codice"&gt;&lt;pre&gt;using System;
using System.ComponentModel;
using System.Windows.Forms.Design;
using System.Drawing.Design;
using System.Web.UI.Design;
using System.ComponentModel.Design;&lt;/pre&gt;&lt;/div&gt;&lt;pre&gt;&lt;strong&gt;[Browsable(false)]&lt;/strong&gt; 
Nasconde una proprietà pubblica all’interno della property grid.

&lt;strong&gt;[Category(&amp;quot;Stringhe di connessione&amp;quot;)]&lt;/strong&gt;
Consente di raggruppare più proprietà in una categoria.

&lt;strong&gt;[Description(&amp;quot;Connessione al DB centrale&amp;quot;)]&lt;/strong&gt; 
Descrizione estesa che compare sotto la griglia nel box dedicato ai tooltip.

&lt;strong&gt;[DefaultValue(xx)]&lt;/strong&gt; 
Consente di specificare il valore di default. Ha override per tutti i tipi base.

[&lt;strong&gt;EditorAttribute(typeof(ConnectionStringEditor), typeof(UITypeEditor))]&lt;/strong&gt; 
Il campo è una stringa e contiene una stringa di connessione. La property grid visualizza un editor apposito (che poi di solito è un banalissimo box di testo multilinea)

&lt;strong&gt;[EditorAttribute(typeof(FolderNameEditor), typeof(UITypeEditor))]&lt;/strong&gt; 
Il campo contiene un nome di cartella. La prop.grid visualizza il pulsante […] che consente di scegliere il path.

&lt;strong&gt;[EditorAttribute(typeof(FileNameEditor), typeof(UITypeEditor))]&lt;/strong&gt; 
Il campo è un percorso ad un file. La prop.grid visualizza il pulsante […] che consente di scegliere un file.

&lt;strong&gt;[EditorAttribute(typeof(CollectionEditor), typeof(UITypeEditor))]&lt;/strong&gt; 
Il campo è una collection. Se type è un tipo base (stringa, interi, ecc) visualizza un editor standard che consente di modificare e aggiungere/togliere elementi dalla collezione. A me nell’aggiungere crashava miseramente... In teoria partendo da questo ci si può derivare un editor personalizzato per collezioni di oggetti propri.

&lt;strong&gt;[EditorAttribute(typeof(MultilineStringEditor), typeof(UITypeEditor))]&lt;/strong&gt;        
Il campo è un testo lungo su più linee. La prop.grid visualizza una casella multilinea per consentire una più agevole digitazione.
&lt;/pre&gt;&lt;pre&gt;&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;font face="Calibri" size="3"&gt;Oltre a questi sono disponibili tutti i derivati di UITypeEditor (per colori, font, icone, data e ora, url, ecc.):&lt;/font&gt;&lt;/p&gt;&lt;font face="Calibri" size="3"&gt;&amp;nbsp;&lt;/font&gt;&lt;p class="MsoNormal" style="MARGIN:0cm 0cm 0pt;"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.drawing.design.uitypeeditor.aspx"&gt;&lt;font face="Calibri" color="#0000ff" size="3"&gt;http://msdn.microsoft.com/en-us/library/system.drawing.design.uitypeeditor.aspx&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;/pre&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=253" width="1" height="1"&gt;</description><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/sviluppo/default.aspx">sviluppo</category></item><item><title>Disabilitare un asp:button al postback, con validazione e conferma</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2008/08/31/disabilitare-un-asp-button-al-postback-compatibilmente-con-la-validazione.aspx</link><pubDate>Sun, 31 Aug 2008 08:37:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:248</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>0</slash:comments><comments>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2008/08/31/disabilitare-un-asp-button-al-postback-compatibilmente-con-la-validazione.aspx#comments</comments><description>&lt;p&gt;In certi casi puo&amp;#39; essere necessario impedire all&amp;#39;utente di premere piu&amp;#39; volte un pulsante: non c&amp;#39;e&amp;#39; un modo standard per farlo allora ho pensato di pacchettizzare alcune strategie trovate sul web&amp;nbsp;sotto forma di&amp;nbsp;due extension method per la classe Button.&lt;/p&gt;
&lt;p&gt;Il primo applica solamente la disabilitazione (manetendo inalterate le validazioni eventualmente presenti sulla pagina), mentre il secondo permette di specificare ancheun testo di conferma prima di procedere col postback.&lt;/p&gt;
&lt;p&gt;Verificate di avere una veriosne del framework uguale o superiore alla .NET 3.5 Service Pack 1, copiatevi questa classe nel progetto, e mettela in un namespace a volta scelta:&lt;/p&gt;
&lt;div class="codice"&gt;&lt;pre&gt;  
public static class ButtonExtender
{
public static void SetDisabledOnPostback(this Button button, String waitMessage)
{

StringBuilder sb = new StringBuilder();
sb.Append(&amp;quot;if (typeof(Page_ClientValidate) == &amp;#39;function&amp;#39;) { &amp;quot;);
if (button.ValidationGroup == &amp;quot;&amp;quot;)
  sb.Append(&amp;quot;if (Page_ClientValidate()&amp;quot;);
else
  sb.AppendFormat(&amp;quot;if (Page_ClientValidate(&amp;#39;{0}&amp;#39;)&amp;quot;, button.ValidationGroup);
sb.Append(&amp;quot; == false) { return false; }} &amp;quot;);
sb.AppendFormat(&amp;quot;this.value = &amp;#39;{0}&amp;#39;;&amp;quot;, waitMessage);
sb.Append(&amp;quot;this.disabled = true;&amp;quot;);

button.UseSubmitBehavior = false;
button.OnClientClick = sb.ToString();


}

public static void SetDisabledOnPostbackWithConfirm(this Button button, 
				String waitMessage, String confirmText)
{

//disabilitazione standard
SetDisabledOnPostback(button, waitMessage);

//aggiunta della conferma
StringBuilder sb = new StringBuilder(button.OnClientClick);
sb.Insert(0, &amp;quot;if (confirm(&amp;#39;&amp;quot; + confirmText + &amp;quot;&amp;#39;) == false){return false;} &amp;quot;);

button.OnClientClick = sb.ToString();

}
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A questo punto è sufficiente che nella pagina di interesse referenziate il namespace in cui avete messo la classe e nel page load lanciate:&lt;/p&gt;
&lt;div class="codice"&gt;&lt;pre&gt;       
this.myButton.SetDisabledOnPostback(&amp;quot;Attendere prego...&amp;quot;);

this.myButton.SetDisabledOnPostbackWithConfirm
                    (&amp;quot;Attendere prego...&amp;quot;, &amp;quot;Vuoi procedere ?&amp;quot;);
&lt;/pre&gt;&lt;/div&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=248" width="1" height="1"&gt;</description><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>Equivalente VB.NET delle lambda expression in C#</title><link>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2008/07/08/equivalente-vb-net-delle-lambda-expression-in-c.aspx</link><pubDate>Tue, 08 Jul 2008 15:01:00 GMT</pubDate><guid isPermaLink="false">fa9be319-1b99-4b79-9046-694cb6565309:242</guid><dc:creator>marcodelgatto</dc:creator><slash:comments>1</slash:comments><comments>http://www.devland.it/cs/blogs/marco-del-gatto/archive/2008/07/08/equivalente-vb-net-delle-lambda-expression-in-c.aspx#comments</comments><description>&lt;p&gt;Se state usando le funzionalità di Linq in C# per l’interrogazione di insiemi vari, vi sarete abituati a sintassi di questo tipo:&lt;/p&gt;
&lt;div class="codice"&gt;User usr= Users.Single(u=&amp;gt;u.Username==&amp;quot;marco&amp;quot;);&lt;/div&gt;
&lt;p&gt;Mi è capitato di dover scrivere l’equivalente VB.NET, e – per ragioni varie – di non voler usare la sintassi espressiva; in questo caso ho trovato difficoltà a reperire informazioni su come tradurre la definizione della lambda: u=&amp;gt;u.Username==”marco”&lt;/p&gt;
&lt;p&gt;Su suggerimento del mio amico Marco Nava, ecco dunque la versione VB.NET:&lt;/p&gt;
&lt;div class="codice"&gt;dim usr as User = Users.Single(Function(u) u.Username=&amp;quot;marco&amp;quot;)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.devland.it/cs/aggbug.aspx?PostID=242" width="1" height="1"&gt;</description><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/sviluppo/default.aspx">sviluppo</category><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/.net/default.aspx">.net</category><category domain="http://www.devland.it/cs/blogs/marco-del-gatto/archive/tags/LINQ/default.aspx">LINQ</category></item></channel></rss>
