do more with less
news, esperienze, esempi da condividere e qualcosa su di me

domenica 25 dicembre 2005

Buoni propositi

Ogni volta che vedo i blog degli amici mi riprometto di essere più presente nel mio per condividere le mie esperienze con la community. Puntualmente, per un motivo o l'altro, finisco sempre per non farlo.
Visto che si avvicina l'anno nuovo, per rispettare la tradizione, voglio rendere pubblico il mio "buon proposito" per l'anno 2006: di diventare un vero blogger. Conto su di voi affinché mi ricordiate quanto sto promettendo oggi ;-)

Buon Natale e Felice Anno Nuovo a tutti

sabato 1 ottobre 2005

Chiusura dell' MVP Global Summit 2005

Oggi è finito l'MVP Global Summit 2005 che si è tenuto a Redmond (WA) dal 28 settembre al 1 ottobre. Molte le novità, alcune già note per chi è stato alla PDC di Los Angeles (Sparkle e  Atlas per esempio) altre meno, alcune delle quali sotto NDA. Certo è che ci aspetta un bel pò di lavoro per aggiornarci ai nuovi prodotti che verranno introdotti nel corso dei prossimi 12 mesi.
Una nota su tutti vorrei farla su "Sparkle" che considero un enorme passo in avanti nella collaborazione tra designer e developer per lo sviluppo di nuove applicazioni. Quanto ho visto mi ha talmente entusiasmato da rendere "Quartz", corrispondente prodotto per i Web Designer, una grande delusione; non perchè quest'ultimo non sia un buon prodotto ma perchè non ha, a causa della differente piattaforma a cui si indirizza, la possibilità di fare quanto viene invece fatto con "Sparkle". Brevemente pensate ad una file immagine creato dal grafico con Photoshop, comprensivo quindi di layer, ecc. Bene, con "Sparkle" il file immagine può trasformarsi in una windows form comprensiva di controlli il tutto basandosi su XAML. Semplicemente favoloso. Ovviamente il prodotto non si limita a questo ma offre molto altre funzionalità che lo rendono un prodotto veramente rivoluzionario.

mercoledì 28 settembre 2005

MVP Global Summit 2005

Mi sono fatto tentare anche quest'anno e sono tornato a Seattle per partecipare al Global Summit dedicato agli MVP. Questo evento è organizzato da Microsoft per dare la possibilità ai suoi MVP di conoscere i team dei prodotti e aggiornarsi su quello che verrà nei prossimi mesi. Un'ottima occasione per conoscere altri MVP e per trascorrere una settimana nel campus di Microsoft.

lunedì 26 settembre 2005

Come faccio ad inserire uno script javascript da una pagina ASP.NET ?

Per registrare uno script da una pagina ASP.NET possono utilizzare il metodo RegisterClientScriptBlock appartenente all'oggetto System.Web.UI.Page.

Viene utilizzato per inserire nella nostra pagina renderizzata uno script lato client che può essere richiamato da un'evento client di uno o più controlli presenti nella pagina. Eccone un semplice esempio:

 

if (!this.IsClientScriptBlockRegistered("MsgBox"))
{
string script = "<script language='JavaScript'>" + "function showMessage(msg){alert(msg);}" + "</script>";
RegisterClientScriptBlock("MsgBox", script);
}

Per evitare di registrare più volte lo stesso blocco di codice è possibile utilizzare il metodo


 


public bool IsClientScriptBlockRegistered(string key);

dove key rappresenta la chiave univoca che identifica lo script nella pagina.

giovedì 22 settembre 2005

Creare dinamicamente immagini in pagine ASP.NET - caricamento da file

Creando le nostre pagine ASP.NET non possiamo prescindere dalla presenza d'immagini per rendere il look & feel delle nostre web application più accattivante. Normalmente usiamo immagini statiche presenti in una cartella della nostra applicazione. In alcuni casi però questo non è sufficiente a soddisfare le nostre esigenze e ci troviamo quindi a dover caricare dinamicamente le immagini da altre risorse. Le possibilità sono molte ed in questo breve articolo cercherò di illustrarne una tra le più usate: il caricamento da file tramite una pagina aspx di servizio.

Questa tecnica è certamente una delle più usate. Probabilmente i fattori che la fanno risultare la più scelta dipende dal fatto che era una tecnica già praticabile con le tecnologie precedenti e che permette una rapida implementazione senza dover approfondire funzionalità avanzate quali possono essere quelle usate con altre tecniche (vedi HttpHandler).
Come prima cosa creiamo una web form che chiameremo Default.aspx. Rappresenterà la nostra pagina principale, pagina che utilizzeremo per inserire il controllo immagine che visualizzerà l'output fornito dalla pagina di servizio (web form che fornisce le immagini). La pagina creata è la seguente:

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<html>
<head>
<title>Caricamento da una pagina aspx</title>
<meta content="Microsoft Visual Studio .NET 7.1" name=GENERATOR>
<meta content=C# name=CODE_LANGUAGE>
<meta content=JavaScript name=vs_defaultClientScript>
<meta content=http://schemas.microsoft.com/intellisense/ie5 name=vs_targetSchema>
</head>
<body>
<form id=MainForm method=post runat="server">
<img alt="" src="GetPicture.aspx?Name=MobileAdvice.gif">
</form>
</body>
</html>

 


Non abbiamo, in questo caso, bisogno di creare alcuna riga di codice nel file di code behind oltre a quanto generato in automatico da Visual Studio. Come potete notare nella pagina Default.aspx è presente un tag html di tipo img. Vediamo in dettaglio come è stato valorizzato l'attributo src per richiamare la nostra pagina di servizio:


 


<img alt="" src="GetPicture.aspx?Name=MobileAdvice.gif">

Come potete notare la pagina richiamata si chiama GetPicture.aspx e richiede un parametro Name in query string indicante il nome del file che si intende visualizzare.
Ora non ci resta che preparare la nostra pagina di servizio e chiamarla GetPicture.aspx. Questa pagina non avrà alcuna interfaccia grafica e quindi ne analizzeremo esclusivamente il code behind . La prima cosa da fare è creare una funzione in grado di leggere il file richiesto predisposta anche per gestire le eventuali eccezioni che dovessero verificarsi. Il codice del metodo creato a questo scopo è il seguente:


private Bitmap GetImage(string name)
{
try
{
Bitmap img = new Bitmap(Server.MapPath("images/" + name));
return img;
}
catch (Exception ex)
{
return this.GetErrorImage(ex.Message);
}
}

All'interno del blocco try è presente la creazione dell'istanza di un oggetto Bitmap utilizzando il costruttore che prevede l'indicazione del file da aprire. Il nome del file viene determinato utilizzando il parametro name fornito al nostro metodo. Qualora questo caricamento generasse un'eccezione, il codice all'interno del blocco catch si preocuperà di chiamare il metodo GetErrorImage che è in grado di generare un'immagine riportante la descrizione dell'errore verificatosi.


private Bitmap GetErrorImage(string error)
{
Bitmap img = new Bitmap(200, 60);
Graphics g = Graphics.FromImage(img);
g.DrawString(error, new Font("Tahoma", 12, FontStyle.Bold, GraphicsUnit.Pixel), SystemBrushes.Window, new Point(20, 20));
g.Dispose();
return img;
}

Le nostre procedure di creazione dell'immagine iniziano al caricamento della pagina, tramite il metodo  Page_Load delegato a gestire tale evento, attivando il processo di creazione dell'immagine richiesta.


private void Page_Load(object sender, System.EventArgs e)
{
if (Request["Name"] != null && Request["Name"] != string.Empty)
this.FlushImage(this.GetImage(Request["Name"]));
else
this.FlushImage(this.GetErrorImage("Nome file non indicato"));
}

La prima verifica effettuata in questa funzione è quella di controllare la presenza della variabile Request["Name"] per capire se saremo in grado di avviare il metodo di caricamento dell'immagine. Qualora questa variabile (passata in query string alla nostra pagina) non fosse presente, viene richiamato il metodo di generazione di un'immagine di errore passando come parametro il testo da inserire nel contenuto da renderizzare. In entrambi i casi, l'immagine risultate da uno dei due metodi viene inviata alla funzione FlushImage incaricata di predisporre l'output all'entità richiedente.


 


private void FlushImage(Bitmap img)
{
if (img.RawFormat.Equals(ImageFormat.Jpeg))
{
Response.ContentType = "image/jpeg";
img.Save(Response.OutputStream, ImageFormat.Jpeg);
}
else if (img.RawFormat.Equals(ImageFormat.Png))
{
Response.ContentType = "image/png";
img.Save(Response.OutputStream, ImageFormat.Png);
}
else
{
Response.ContentType = "image/gif";
img.Save(Response.OutputStream, ImageFormat.Gif);
}
img.Dispose();
Response.End();
}

Questo metodo, dopo aver verificato il corretto formato dell'immagine, imposta il ContentType e l'OutputStream della Response da inviare in risposta alla Request ricevuta.


Come si può notare, con poche righe di codice, siamo in grado di richiamare un'immagine in modo dinamico. Immagine il cui nome potrebbe essere impostato a runtime in base a criteri specifici della nostra web application.

martedì 20 settembre 2005

Community Preview site for ASP.NET code-named "Atlas"

In questo periodo se ne parla molto. Se vuoi saperne di più ecco il link al sito del Community Preview Site for ASP.NET code-named “Atlas".

Buona lettura.

sabato 16 luglio 2005

Web Custom Controls.....e l'icona 16 x 16

Durante la mia seconda sessione tenuta al Workshop "Component Development" di UGIdotNET, ha sollevato qualche perplessità la mia affermazione che l'icona da utilizzare per il proprio controllo dovesse essere di dimensioni 16x16. Effettivamente così è. Quello che ha però messo la platea fuori strada è stato il fatto ch'io non abbia modificato le proprietà dell'icona lasciando le impostazioni di default (48x48). L'esempio ha poi comunque funzionanto e l'immagine si è vista nella toolbox. Questo però grazie ad un'adattamento fatto da Visual Studio. Quindi, per una corretta predisposizione dell'icona, prima di iniziare a disegnarla è necessario ridimensionare lo spazio di lavoro dalla finestra proprietà indicando per le proprietà Height e Width 16.

Per chi ne volesse sapere di più ecco un utile link: Walkthrough: Creating a Web Custom Control

Technorati tags: , ,

sabato 21 maggio 2005

BindingSource e collezioni di oggetti: come sfruttare le nuove caratteristiche di .NET 2.0

Giocando con il BindingSource in un progetto Windows Forms, ho scoperto che le funzionalità di ricerca ed ordinamento non sono automaticamente supportate se si usa una propria collezione di oggetti. Sicuramente molti di voi ci saranno già arrivati ed avranno scoperto come risolvere il problema. Per chi invece, come me, sta approfondendo queste tematiche solo ora può trovare interessante l'articolo di Michael Weinhardt che potete trovare qui:

Custom Data Binding, Part 1
Custom Data Binding, Part 2
Custom Data Binding, Part 3

Buona lettura, ne vale la pena.

giovedì 10 febbraio 2005

Tour di migrazione da ASP a ASP.NET

Sta per partire il tour di migrazione da ASP a ASP.NET. Ho la fortuna di poter annoiare qualcuno di voi facendo da speaker a Bologna, Torino e Milano.

Vi aspetto numerosi quindi sotto con le iscrizioni .... !

P.S.
Se non potete esserci nelle date in cui parlerò io potete sempre decidere di farvi stupire con effetti speciali da Andrea, Daniele o Roberto scegliendo una delle altre date previste ;-).