<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Scoperte di un principiante</title>
        <link>http://blogs.ugidotnet.org/danBlog/category/Scoperte di un principiante.aspx</link>
        <description>Cosa ho imparato oggi?</description>
        <language>it-IT</language>
        <copyright>Daniele Armanasco</copyright>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>Thread asincrono e pagine asp.net</title>
            <link>http://blogs.ugidotnet.org/danBlog/archive/2008/05/30/92875.aspx</link>
            <description>Contesto: devo lanciare un'operazione che può durare molto tempo eseguita da un metodo sincrono che non torna eventi (legacy). Devo fornire un feedback all'utente (una sorta di pagina clessidra) e, a lavoro terminato, mostrare il risultato.
Soluzione adottata: creo una pagina per iniziare l'operazione e configurarne i parametri (pagina Start), una autorefreshante per comunicare che il lavoro è in corso (pagina Wait) e una pagina per mostrare i risultati (pagina Results).
La pagina Start:
- mette in sessione un flag per indicare che il calcolo è in corso
- istanzia un delegate per richiamare il metodo sincrono con un nuovo thread; 
- lancia il nuovo thread passando eventuali parametri del metodo, un riferimento al metodo di callback e un riferimento al caller stesso
- carica la pagina Wait
Il caller del MetodoLungo:
- a lavoro completato richiama il metodo di callback sulla pagina Start
Il metodo di callback (su Start):
- riaggancia il chiamante
- recupera il risultato del calcolo usando EndInvoke sul chiamante
- mette il risultato in sessione
- setta il flag in sessione per indicare che il calcolo è terminato
La pagina Wait:
- ha un tag meta (magari inserito da codice) per fare il refresh automatico
- verifica il flag in sessione per sapere quando passare alla pagina dei risultati
La pagina Results:
- recupera il risultato dalla sessione e lo mostra
Codice:
pagina Start:
   public delegate TipoRisultatoCalcoloLungo MetodoLungoAsyncCaller(TipoParametro1MetodoLungo par1,   TipoParametro2MetodoLungo par2);
    public partial class StartPage
    {
     ...
     void Toolbar1_ButtonClick(object sender, ToolbarEventArgs ea)
        {
              Session[SessionConstants.SCAN_IN_PROGRESS] = true;
                        // Create the delegate.
                        MetodoLungoAsyncCaller caller = new MetodoLungoAsyncCaller(MetodoLungo);
                        // Initiate the asychronous call.  Include an AsyncCallback
                        // delegate representing the callback method, and the data
                        // needed to call EndInvoke.
                        IAsyncResult result = caller.BeginInvoke(valorePar1, valorePar2,
                            new AsyncCallback(CallbackMethod),
                            caller);
                        // goto to "hourglass" page
                        Response.Redirect(WebFormsConstants.WAIT_ASPX);
        }
        ...
        // Callback method
        public void CallbackMethod(IAsyncResult ar)
        {
            // Retrieve the delegate.
            MetodoLungoAsyncCaller caller = (MetodoLungoAsyncCaller)ar.AsyncState;
            // Call EndInvoke to retrieve the results.
            TipoRisultatoCalcoloLungo risultato = caller.EndInvoke(ar);
            Session[SessionConstants.RISULTATO] = risultato;
            // set flag in session to comunicate scan completed
            Session[SessionConstants.SCAN_IN_PROGRESS] = false;
         }
         ...
}
pagina Wait:
protected void Page_Load(object sender, EventArgs e)
        {
            HtmlMeta meta = new HtmlMeta();
            meta.HttpEquiv = "refresh";
            meta.Content = "10";
            Header.Controls.Add(meta);
            if ((Boolean)Session[SessionConstants.SCAN_IN_PROGRESS] == false)
                Response.Redirect(WebFormsConstants.RESULT_ASPX);
            Message1.Text = "In Progress";
        }
 &lt;img src="http://blogs.ugidotnet.org/danBlog/aggbug/92875.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Daniele Armanasco</dc:creator>
            <guid>http://blogs.ugidotnet.org/danBlog/archive/2008/05/30/92875.aspx</guid>
            <pubDate>Fri, 30 May 2008 04:45:57 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/danBlog/archive/2008/05/30/92875.aspx#feedback</comments>
            <slash:comments>8</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/danBlog/comments/commentRss/92875.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/danBlog/services/trackbacks/92875.aspx</trackback:ping>
        </item>
        <item>
            <title>Meta tag per refresh automatico pagina</title>
            <link>http://blogs.ugidotnet.org/danBlog/archive/2008/05/30/92874.aspx</link>
            <description>Promemoria:          
            System.Web.UI.HtmlControls.HtmlMeta meta = new System.Web.UI.HtmlControls.HtmlMeta();
            meta.HttpEquiv = "refresh";
            meta.Content = "5";  // secondi
            Header.Controls.Add(meta);&lt;img src="http://blogs.ugidotnet.org/danBlog/aggbug/92874.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Daniele Armanasco</dc:creator>
            <guid>http://blogs.ugidotnet.org/danBlog/archive/2008/05/30/92874.aspx</guid>
            <pubDate>Fri, 30 May 2008 04:30:29 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/danBlog/archive/2008/05/30/92874.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/danBlog/comments/commentRss/92874.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/danBlog/services/trackbacks/92874.aspx</trackback:ping>
        </item>
        <item>
            <title>Escape di caratteri speciali</title>
            <link>http://blogs.ugidotnet.org/danBlog/archive/2007/11/15/89700.aspx</link>
            <description> - stringhe classiche: myString = "prova=\"aaa\"" (uso \)
 - stringhe con @: myString = @"prova=""aaa""" (raddoppio gli apici)&lt;img src="http://blogs.ugidotnet.org/danBlog/aggbug/89700.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Daniele Armanasco</dc:creator>
            <guid>http://blogs.ugidotnet.org/danBlog/archive/2007/11/15/89700.aspx</guid>
            <pubDate>Thu, 15 Nov 2007 00:11:54 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/danBlog/archive/2007/11/15/89700.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/danBlog/comments/commentRss/89700.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/danBlog/services/trackbacks/89700.aspx</trackback:ping>
        </item>
        <item>
            <title>New line</title>
            <link>http://blogs.ugidotnet.org/danBlog/archive/2007/11/15/89698.aspx</link>
            <description>System.Environment.NewLine OPPURE "/r/n"&lt;img src="http://blogs.ugidotnet.org/danBlog/aggbug/89698.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Daniele Armanasco</dc:creator>
            <guid>http://blogs.ugidotnet.org/danBlog/archive/2007/11/15/89698.aspx</guid>
            <pubDate>Thu, 15 Nov 2007 00:09:21 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/danBlog/archive/2007/11/15/89698.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/danBlog/comments/commentRss/89698.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/danBlog/services/trackbacks/89698.aspx</trackback:ping>
        </item>
        <item>
            <title>Rimuovere elementi da una Collection su cui devo ciclare</title>
            <link>http://blogs.ugidotnet.org/danBlog/archive/2007/11/15/89697.aspx</link>
            <description>

Siccome non posso rimuovere elementi da una collection mentre la sto scorrendo con un ciclo foreach, devo salvare gli elementi da eliminare in una lista temporanea e fare poi un altro ciclo, sulla lista temporanea, per rimuoverli:
IList&amp;lt;Child&amp;gt; childrenToDelete = new List&amp;lt;Child&amp;gt;();                    
foreach (Child child in Father.Children)
{
   if (...)
      childrenToDelete.Add(child);
}
foreach (Child child in childrenToDelete)
   Father.Children.Remove(child);
                        
&lt;img src="http://blogs.ugidotnet.org/danBlog/aggbug/89697.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Daniele Armanasco</dc:creator>
            <guid>http://blogs.ugidotnet.org/danBlog/archive/2007/11/15/89697.aspx</guid>
            <pubDate>Thu, 15 Nov 2007 00:02:03 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/danBlog/archive/2007/11/15/89697.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/danBlog/comments/commentRss/89697.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/danBlog/services/trackbacks/89697.aspx</trackback:ping>
        </item>
        <item>
            <title>Implementare flags mediante operatori bitwise</title>
            <link>http://blogs.ugidotnet.org/danBlog/archive/2007/11/14/89696.aspx</link>
            <description>Innanzitutto dichiaro un enum con la lista dei possibili flag; è importante che l'enum abbia l'attributo [Flags] e che gli elementi della lista abbiano associato un valore che sia potenza di 2 (1, 2, 4, ...). Si possono definire fino a 32 elementi.
[Flags] private enum Buttons : int 
{
···Ok = 1, Cancel = 2, Retry = 4, Help = 8
}
Tip: è possibile aggiungere alla enumerazione un elemento "All" così: All = Ok | Cancel | Retry | Help
Attivare più flag: concatenali con l'operatore bitwise "|" (or):
Buttons buttons;
buttons = Buttons.Ok | Buttons.Cancel;

Disattivare un flag: usa l'operatore bitwise "~" (not):
buttons &amp;amp;= ~Buttons.Cancel;
Verificare se un flag è attivo: 
Testing to see if a certain flag is set: usa l'operatore bitwise "&amp;amp;" (and):
if ((buttons&amp;amp;Buttons.Ok)==Buttons.Ok)
···Console.WriteLine("Ok");&lt;img src="http://blogs.ugidotnet.org/danBlog/aggbug/89696.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Daniele Armanasco</dc:creator>
            <guid>http://blogs.ugidotnet.org/danBlog/archive/2007/11/14/89696.aspx</guid>
            <pubDate>Wed, 14 Nov 2007 23:41:04 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/danBlog/archive/2007/11/14/89696.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/danBlog/comments/commentRss/89696.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/danBlog/services/trackbacks/89696.aspx</trackback:ping>
        </item>
        <item>
            <title>Interfacce</title>
            <link>http://blogs.ugidotnet.org/danBlog/archive/2007/09/12/88284.aspx</link>
            <description>Sono comode per simulare l'ereditarietà multipla.
Esempio: il padre di un container può essere di tipo Grid o item; per poter castare il parent del container a qualcosa e richiamare un metodo uguale su grid e item, ho dovuto definire una interfaccia generica che prevede il metodo, specificare che grid e item la implementano, castare il parent all'interfaccia e richiamare il metodo.
public interface IGenericElement
    {
        GenericGrid Grid();
        IGenericElement Father();
    }


public partial class GenericGrid : System.Web.UI.UserControl, IGenericElement
    {
        ...
        public GenericGrid Grid()
        {
            return this; 
        }
        public IGenericElement Father()
        {
            return this; 
        }
 ...
    }

    public partial class GenericContainer : System.Web.UI.UserControl, IGenericElement
    {
 ...
        public GenericGrid Grid()
        { 
            return ((IGenericElement) Parent).Grid();
        }
        public IGenericElement Father()
        {
            // container father could be a grid or an item
            return (IGenericElement) Parent; 
        }
espongo una proprietà della griglia attraverso il container:
        public Boolean IsInList
        {
            get { return Grid().IsList ; }
        }
    }
public abstract partial class GenericItemBase : System.Web.UI.UserControl, IGenericElement
    {
 ...
        public GenericGrid Grid()
        {
            return ((IGenericElement) Parent).Grid();
        }
        public IGenericElement Father()
        {
            // item father is always a container
            return (IGenericElement)Parent;
        }
espongo una property della grid attraverso l'item:
        public Boolean IsInList
        {
            get { return Grid().IsList; }
        }
espongo una property del container padre (item contenuti solo in container) attraverso l'item:
        public Boolean IsInNestedContainer
        {
            get { return ((GenericContainer) Father()).NestChildren; }
        }
NOTA: l'interfaccia specifica metodi, non property.
&lt;img src="http://blogs.ugidotnet.org/danBlog/aggbug/88284.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Daniele Armanasco</dc:creator>
            <guid>http://blogs.ugidotnet.org/danBlog/archive/2007/09/12/88284.aspx</guid>
            <pubDate>Wed, 12 Sep 2007 03:54:19 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/danBlog/archive/2007/09/12/88284.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/danBlog/comments/commentRss/88284.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/danBlog/services/trackbacks/88284.aspx</trackback:ping>
        </item>
        <item>
            <title>Serializzazione in JSON</title>
            <link>http://blogs.ugidotnet.org/danBlog/archive/2007/09/12/88280.aspx</link>
            <description>Per serializzare in JSON un oggetto:
System.Web.Script.Serialization.JavaScriptSerializer serializer = new JavaScriptSerializer();
String result = serializer.Serialize(o);&lt;img src="http://blogs.ugidotnet.org/danBlog/aggbug/88280.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Daniele Armanasco</dc:creator>
            <guid>http://blogs.ugidotnet.org/danBlog/archive/2007/09/12/88280.aspx</guid>
            <pubDate>Wed, 12 Sep 2007 02:59:35 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/danBlog/archive/2007/09/12/88280.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/danBlog/comments/commentRss/88280.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/danBlog/services/trackbacks/88280.aspx</trackback:ping>
        </item>
        <item>
            <title>Avviare un processo</title>
            <link>http://blogs.ugidotnet.org/danBlog/archive/2007/09/12/88279.aspx</link>
            <description>Per avviare un processo (ad esempio aprire il browser all'indirizzo in LinkLabel):
System.Diagnostics.Process.Start(LinkLabel1.Text)&lt;img src="http://blogs.ugidotnet.org/danBlog/aggbug/88279.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Daniele Armanasco</dc:creator>
            <guid>http://blogs.ugidotnet.org/danBlog/archive/2007/09/12/88279.aspx</guid>
            <pubDate>Wed, 12 Sep 2007 02:53:28 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/danBlog/archive/2007/09/12/88279.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/danBlog/comments/commentRss/88279.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/danBlog/services/trackbacks/88279.aspx</trackback:ping>
        </item>
        <item>
            <title>Leggere dati postati da controlli html client-side</title>
            <link>http://blogs.ugidotnet.org/danBlog/archive/2007/09/12/88277.aspx</link>
            <description>Supponendo di costruire, nel page load, i seguenti controlli html iniettando il testo in un literal
            sb = new StringBuilder();
            sb.Append("&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Sezione CHECKBOX&amp;lt;br/&amp;gt;");
            sb.Append("&amp;lt;input name='chk1' type='checkbox' checked=\"checked\" /&amp;gt;");
            sb.Append("&amp;lt;input name='chk2' type='checkbox' /&amp;gt;");
            sb.Append("&amp;lt;br/&amp;gt;Sezione INPUT TEXT &amp;lt;input type='text' name='txt1' value='testo predefinito' /&amp;gt;&amp;lt;br/&amp;gt;");
            sb.Append("&amp;lt;br/&amp;gt;Sezione SELECT ");
            sb.Append("&amp;lt;select name='sel1'&amp;gt;&amp;lt;option value='1'&amp;gt;voce 1&amp;lt;/option&amp;gt;&amp;lt;option value='2'&amp;gt;voce 2&amp;lt;/option&amp;gt;&amp;lt;/select&amp;gt;");
            
            litBody.Text = sb.ToString();
è possibile leggere il valore degli stessi con l'istruzione:


Object o = Request.Form.Get("chk1");
e via di seguito con gli altri Name dei controlli.

o conterrà: 
"on" per le checkbox selezionate (sarà null per quelle non selezionate perchè non vengono postate)
il testo inserito nelle textbox
il valore associato all'opzione selezionata per le select
NOTA: per leggere il post devo far riferimento al name e non all'id!&lt;img src="http://blogs.ugidotnet.org/danBlog/aggbug/88277.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Daniele Armanasco</dc:creator>
            <guid>http://blogs.ugidotnet.org/danBlog/archive/2007/09/12/88277.aspx</guid>
            <pubDate>Wed, 12 Sep 2007 02:30:13 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/danBlog/archive/2007/09/12/88277.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/danBlog/comments/commentRss/88277.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/danBlog/services/trackbacks/88277.aspx</trackback:ping>
        </item>
    </channel>
</rss>