Scoperte di un principiante

Cosa ho imparato oggi?

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...

Promemoria:                       System.Web.UI.HtmlControls.HtmlMeta meta = new System.Web.UI.HtmlControls.HtmlMeta();             meta.HttpEquiv = "refresh";             meta.Content = "5";  // secondi             Header.Controls.Add(meta);

 - stringhe classiche: myString = "prova=\"aaa\"" (uso \)  - stringhe con @: myString = @"prova=""aaa""" (raddoppio gli apici)

System.Environment.NewLine OPPURE "/r/n"

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<Child> childrenToDelete = new List<Child>();                    foreach (Child child in Father.Children) {    if (...)       childrenToDelete.Add(child); } foreach (Child child in childrenToDelete)    Father.Children.Remove(child);                        

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 &= ~Buttons.Cancel; Verificare se un flag...

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    ...

Per serializzare in JSON un oggetto: System.Web.Script.Serialization.JavaScriptSerializer serializer = new JavaScriptSerializer(); String result = serializer.Serialize(o);

Per avviare un processo (ad esempio aprire il browser all'indirizzo in LinkLabel): System.Diagnostics.Process.Start(LinkLabel1.Text)

Supponendo di costruire, nel page load, i seguenti controlli html iniettando il testo in un literal             sb = new StringBuilder();             sb.Append("<br/><br/>Sezione CHECKBOX<br/>");             sb.Append("<input name='chk1' type='checkbox' checked=\"checked\" />");             sb.Append("<input name='chk2' type='checkbox' />");             sb.Append("<br/>Sezione INPUT TEXT <input type='text' name='txt1' value='testo predefinito' /><br/>");             sb.Append("<br/>Sezione SELECT ");             sb.Append("<select name='sel1'><option value='1'>voce 1</option><option value='2'>voce 2</option></select>");                         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:...