DanBlog

Il blog di Daniele Armanasco
posts - 48, comments - 73, trackbacks - 10

Scoperte di un principiante

Cosa ho imparato oggi?
Thread asincrono e pagine asp.net

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

posted @ venerdì 30 maggio 2008 04:45 | Feedback (8) | Filed Under [ Scoperte di un principiante ]

Meta tag per refresh automatico pagina

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

posted @ venerdì 30 maggio 2008 04:30 | Feedback (1) | Filed Under [ Scoperte di un principiante ]

Escape di caratteri speciali

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

posted @ giovedì 15 novembre 2007 00:11 | Feedback (1) | Filed Under [ Scoperte di un principiante ]

New line

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

posted @ giovedì 15 novembre 2007 00:09 | Feedback (4) | Filed Under [ Scoperte di un principiante ]

Rimuovere elementi da una Collection su cui devo ciclare

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);                        

posted @ giovedì 15 novembre 2007 00:02 | Feedback (2) | Filed Under [ Scoperte di un principiante ]

Implementare flags mediante operatori bitwise

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

posted @ mercoledì 14 novembre 2007 23:41 | Feedback (1) | Filed Under [ Scoperte di un principiante ]

Interfacce

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

posted @ mercoledì 12 settembre 2007 03:54 | Feedback (1) | Filed Under [ Scoperte di un principiante ]

Serializzazione in JSON

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

posted @ mercoledì 12 settembre 2007 02:59 | Feedback (1) | Filed Under [ Scoperte di un principiante ]

Avviare un processo

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

posted @ mercoledì 12 settembre 2007 02:53 | Feedback (1) | Filed Under [ Scoperte di un principiante ]

Leggere dati postati da controlli html client-side

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

posted @ mercoledì 12 settembre 2007 02:30 | Feedback (1) | Filed Under [ Scoperte di un principiante ]

NUnit + NHibernate

Per testare in NUnit i metodi di persistenza (direttamente in Persistence o tramite provider e manager), siccome normalmente la classe SessionHelper carica la configurazione di NH leggendo dall'assembly in esecuzione, e siccome usando la gui di NUnit l'assembly in esecuzione è quello del progetto NUnit, è necessario aggiungere al progetto di test un file di configurazione che sarà nella stessa directory del progetto NUnit collegato e che conterrà la configurazione per NH; nel progetto NUnit selezionare Project - Edit - Configurazione - File Name e indicare il nome del file di configurazione appena creato.

posted @ giovedì 16 agosto 2007 02:42 | Feedback (0) | Filed Under [ Scoperte di un principiante NHibernate ]

NHibernate quick start

- installare, se necessario, NH - aggiungere il progetto Persistence alla solution - aggiungere a Persistence il riferimento a NHibernate.dll e ai progetti della solution necessari (BusinessObjetcts, ...) - aggiungere al file di configurazione del progetto che verrà avviato la sezione per NH: <configSections> <section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> </configSections> <nhibernate> <add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" /> <add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver" /> <add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2005Dialect" /> <add key="hibernate.connection.connection_string" value="Server=localhost; Integrated Security=SSPI; Database=ComLog;" /> <add key="hibernate.default_schema" value="dbo" /> <!-- General --> <add key="hibernate.use_proxy_validator" value="true"/> <!-- SQL Generation --> <add key="hibernate.max_fetch_depth" value="2"/> <add key="hibernate.show_sql" value="false"/> <add key="hibernate.connection.release_mode" value="on_close" /> <!-- Reflection Optimizer: null | lcg | codedom...

posted @ giovedì 16 agosto 2007 02:37 | Feedback (1629) | Filed Under [ Scoperte di un principiante NHibernate ]

NUNIT quick start

Utilizzare NUnit in un progetto: - installare, se necessario, il programma; - aggiungere un progetto di test alla solution; in questo progetto: - aggiungere un riferimento a nunit.framework.dll - aggiungere le classi di test (TestFixture; DEVONO ESSERE PUBLIC) e i test veri e propri (DEVONO RITORNARE VOID E NON DEVONO AVERE PARAMETRI): using NUnit.Framework; using BusinnessObjects; namespace Test { [TestFixture] public class UserTest { [Test] public void DefaultUserAreNotDestination() { User user = new User(); user.Name = "Pinco Pallino"; Assert.AreEqual(false, user.IsDestination); } - avviare il programma di esecuzione dei test (nunit-gui.exe) e in esso: - definire un nuovo progetto di test e salvarlo - aggiungere al progetto di...

posted @ lunedì 13 agosto 2007 05:16 | Feedback (0) | Filed Under [ Scoperte di un principiante ]

[C#] Operator ??

The ?? operator returns the left-hand operand if it is not null, or else it returns the right operand. int y = x ?? -1; oppure if ((reader.GetAttribute("showheader") ?? String.Empty).ToUpper() == "TRUE")

posted @ giovedì 9 agosto 2007 16:35 | Feedback (0) | Filed Under [ Scoperte di un principiante ]

Embeddare un file xml nell'assembly e recuperarne il testo a run-time

Aggiungo al progetto il file XML e imposto Build Action = Embedded resource. Se necessario creo un nuovo file di definizione delle risorse dalle proprietà del progetto. Nel file di definizione delle risorse aggiungo una risorsa di tipo File. A run-time recupero il file:             using System.Resources;             ...             ResourceManager rm = new ResourceManager("NomeProgetto.Properties.Resources", System.Reflection.Assembly.GetExecutingAssembly());             Object file = rm.GetObject("NomeRisorsa");             String info = file.ToString();  

posted @ giovedì 9 agosto 2007 13:37 | Feedback (1) | Filed Under [ Scoperte di un principiante ]

ASP.NET - Rendering automatico di uno user control con puro html

Contesto: voglio creare un controllo che generi html "puro" a mia completa discrezione. Quasi-soluz. 1: creo uno user control contenente solo un literal. Creo un metodo di rendering che costruisce la stringa html e la assegna alla proprietà Text del literal. Se non ho bisogno di settare proprietà dal codice che utilizza lo user control posso richiamare il metodo di rendering sul page load. In caso contrario devo dichiarare come public il metodo di rendering e chiamarlo esplicitamente dal codice utilizzatore dopo aver impostato le proprietà necessarie (magari per definire la sorgente dati). Soluzione 2: sovrascrivo il metodo di rendering che tutti...

posted @ venerdì 3 agosto 2007 19:40 | Feedback (1) | Filed Under [ Scoperte di un principiante ]

NHibernate - file di configurazione

Situazione: i file di mapping e le classi helper di NH stannno nel progetto Persistence a cui il progetto Web ed altri progetti fanno riferimento. Essendo diversi i progetti che utilizzano Persistence non si vuole duplicare la configurazione di NH per ognuno di essi, per cui si è deciso di non inserirla nel web.config ma in un file di configurazione presente in Persistence. Pb1: il file di configurazione, normalmente, non segue il file assembly (che in fase di compilazione viene copiato nella directory del progetto "chiamante"). Soluzione: imposto Copy to output directory = copy always per il file di configurazione.   Pb2: la sessionFactory deve...

posted @ mercoledì 18 luglio 2007 15:51 | Feedback (1) | Filed Under [ Scoperte di un principiante NHibernate ]

NHibernate: formattare le date in HQL

Il formato più conveniente è: day.ToString( "yyyy/MM/dd");

posted @ venerdì 18 maggio 2007 01:03 | Feedback (1) | Filed Under [ Scoperte di un principiante NHibernate ]

Pulsanti in una gridview

Aggiungo alla gridview un button field di cui imposto la proprietà CommandName con un nome arbitrario necessario per distinguerlo da eventuali altri button field. Imposto la proprietà DataKeysName della gridview con la chiave primaria dei record in tabella. Sull'evento RowCommand della gridview stabilisco quale comando è stato premuto, leggo l'indice della riga selezionata dagli argomenti dell'evento e stabilisco il valore della chiave primaria usando l'indice nell'array dei valori delle chiave primarie; poi eseguo il codice necessario: protected void grvOrders_RowCommand(object sender, System.Web.UI.WebControls.GridViewCommandEventArgs e)if (e.CommandName.Equals("SelectOrder"))int index = Convert.ToInt32(e.CommandArgument);String number = grvOrders.DataKeys[index].Value.ToString(); {   {     orderNumber.Text = number; } }

posted @ martedì 15 maggio 2007 23:24 | Feedback (1) | Filed Under [ Scoperte di un principiante ]

NHibernate: eccezione "a different object with the same identifier value was already associated with the session" - SaveOrUpdateCopy

Non ho ancora avuto il tempo di comprendere a fondo la questione, però quando utilizzavo SaveOrUpdate per aggiornare un oggetto già oggetto dello stesso metodo un paio di volte, ottenevo l'eccezione indicata e il record nel db non veniva aggiornata con il Flush successivo. Usando invece SaveOrUpdateCopy, se l'oggetto è già presente nel contesto di persistenza, non viene generata l'eccezione ma viene aggiornato l'oggetto presente (ciò che io pensavo facesse SaveOrUpdate; a questo punto cosa fa SaveOrUpdate? E Update?)

posted @ lunedì 23 aprile 2007 01:39 | Feedback (2) | Filed Under [ Scoperte di un principiante NHibernate ]

NHibernate: eccezione "unexpected row count: 0, expected: 1" - generazione Guid

L'eccezione si verificava durante il flush di una sessione in cui avevo salvato, con SaveOrUpdate, un nuovo oggetto ancora transiente; il problema era dovuto al fatto che avevo generato da codice il guid e quindi il metodo SaveOrUpdate pensava di aver a che fare con un oggetto esistente nel db!

posted @ domenica 22 aprile 2007 23:30 | Feedback (1) | Filed Under [ Scoperte di un principiante ]

Ciclo di vita della pagina (ordine di generazione degli eventi)

Da classico programmatore Windows, ieri mi sono accorto di fare un errore ecclatante in una pagina ASP.Net: la visualizzazione di alcuni controlli dipende dallo stato dell'applicazione (è una sorta di Wizard); sia sul page load che sul pulsante per avanzare richiamavo il metodo per visualizzare i controlli opportuni. Pb: non ho considerato che l'evento page load avviene sempre (ad ogni aggiornamento della pagina) e prima dell'evento generato dal pulsante avanti, per cui l'azione che cambiava effettivamente lo stato, eseguita sul click del pulsante, avveniva dopo che il page load aveva gestito lo stato come se fosse ancora il precedente. Soluzione: la gestione dello...

posted @ domenica 22 aprile 2007 12:54 | Feedback (0) | Filed Under [ Scoperte di un principiante ]

Introduzione

In questa categoria vorrei appuntarmi ciò che ogni giorno spero di scoprire relativamente al mondo .Net. Non pubblicherò sul muro questi post perchè da perfetto principiante molte scoperte saranno relative "all'acqua calda". L'obiettivo sarebbe di scoprire almeno una cosa al giorno; vedremo ...

posted @ domenica 22 aprile 2007 12:40 | Feedback (1) | Filed Under [ Scoperte di un principiante ]

Powered by:
Powered By Subtext Powered By ASP.NET