Saturday, November 29, 2008

Seadragon Ajax

. Saturday, November 29, 2008
0 commenti

Dai cantieri di Microsoft Live Labs un altro progetto decisamente cool: Seadragon Ajax, un'interfaccia che consente a chiunque di utilizzare la tecnologia Seadragon all'interno del proprio sito.
Questa tecnologia implementa Deep Zoom una delle feature più interessanti di Silverlight che permette di effettuare zoom su immagini di qualsiasi dimensione, indipendentemente dalla larghezza di banda della rete.
Per provare Seadragon Ajax si può procedere in due modi:

  • Uploadare l'immagine tramite il sito sperimentale PhotoZoom ed usare Embed Builder.
  • Creare un Deep Zoom Image tramite Deep Zoom Composer per poi effettuare l'upload sul proprio sito.
  • Ecco il risultato ( foto presa da Flick):

Read More »»

Tuesday, November 25, 2008

Link .Net #9

. Tuesday, November 25, 2008
0 commenti

Nono appuntamento con Link .Net:


Smooth Streaming: video in alta definizione senza buffering
Qualche informazioni su Silverlight Smooth Streaming una nuova funzionalità di Silverlight per l’erogazione di contenuti video via HTTP. it

Workflow: tasks which can only be actioned by task owner
Come settare le permission su un task creato all'interno di un Workflow. en

Using an HttpModule to detect page refresh
Distinguere un postback da un refresh tramite un HTTPModule. en

Slides and resources for TechED presentations about debugging .NET issues with Windbg
Una serie di risorse fondamentali per il debugging .NET. en

Read More »»

Sunday, November 23, 2008

Bamboo SharePoint Analyzer

. Sunday, November 23, 2008
0 commenti

SharePointAnalyzer Bamboo Solutions l'azienda che si occupa principalmente della creazione di web parts per la piattaforma SharePoint ha recentemente rilasciato l'ultima versione di SharePoint Analyzer.
Si tratta di un tool free che permette di analizzare l'intero ambiente SharePoint, dalle configurazioni dell'installazione (patch, aggiornamenti, informazioni sul database), al monitoraggio dei servizi e dei loro status.

Read More »»

Tuesday, November 18, 2008

Witty

. Tuesday, November 18, 2008
0 commenti

Witty Sicuramente in molti già lo conoscono o lo usano, per chi invece non ne ha ancora sentito parlare, segnalo Witty un client free per Twitter.
Scritto usando WPF (Windows Presentation Foundation), funziona sia su sistema Windows Vista che Windows Xp.
Tra le varie feature da sottolineare la possibilità di personalizzazione attraverso l'uso di skin oppure la presenza di un servizio di Spell Checking, oltre alle principali opzioni fornite da Twitter.
La distribuzione avviene tramite la tecnologia ClickOnce, che garantisce  l'aggiornamento automatico dell'applicazione nel caso di rilascio di nuove release.

Read More »»

Wednesday, November 12, 2008

Ritornare valore da popup con JQuery

. Wednesday, November 12, 2008
0 commenti

Nello sviluppo di web application, può capitare di dover ritornare uno o più valori selezionati in una pagina di popup ad una pagina parent.  Per questo scopo userò lo strafamoso framework jQuery.
Tra gli strumenti di lavoro, oltre alla libreria, troverete Visual Studio 2008 SP1 con supporto per l'intellisense.
jQuery 1.2.6 (Visual Studio Autocomplete Documentation)
è il primo risultato visibile dell'accordo che Microsoft ha recentemente stretto con il team di jQuery per integrare completamente questa magnifica libreria nella versione 2010 di Visual Studio.
Per maggiori dettagli vi rimando al post di Rick Strahl.
Ma passiamo a dare uno sguardo ad un pò di codice.
Per il tutorial servono due web form:
Default.aspx
Popup.aspx
composte rispettivamente, dal punto di vista del markup, nel seguente modo:

   1: <body>
   2:   <form id="form1" runat="server">
   3:     <div>
   4:       <asp:TextBox ID="txtValue" runat="server" Text="Pagina 1"></asp:TextBox>
   5:       <input type="button" id="btnOpen" value="Open" onclick="Open()"/>
   6:     </div>
   7:   </form>
   8: </body>

   1: <body>
   2:   <form id="form1" runat="server">
   3:     <div>
   4:       <asp:TextBox ID="txtReturnValue" runat="server" Text=""></asp:TextBox>
   5:       <input type="button" id="btnReturn" value="Ritorno" onclick="SetValue()" />
   6:     </div>
   7:   </form>
   8: </body>

Entrambe le pagine presentano un controllo textbox e un input di tipo button.
Nello specifico, l'input con id btnOpen richiama una funzione javascript che si occupa di aprire la pagina Popup.aspx allo scatenarsi dell'evento onclick:


   1: <script type="text/javascript">
   2:   function Open() {
   3:     $(open("Popup.aspx", "external", "width=300;height=300;resizable=0"));
   4:   }
</script>

Non ci resta che inviare il valore del textbox con id txtReturnValue della pagina di Popup.aspx alla pagina chiamante, settando il valore del textbox con id txtValue:


   1: <script type="text/javascript">
   2:   function SetValue() {
   3:     window.parent.opener.$("#txtValue").val($("#txtReturnValue").val());
   4:     $(close());
   5:   }
</script>


Il linea di massima con tre linee di codice si è raggiunto l'obiettivo.
Vediamo di rendere l'esempio un pò più "appetitoso".
Supponiamo di avere una griglia con una lista di dati e supponiamo che dalla pagina di popup vogliamo indicare un valore su cui eseguire un filtro.
I passi per raggiungere lo scopo possono essere:


  • Dalla pagina Popup.aspx richiamare una funzione javascript nella pagina Default.aspx passando come parametro il valore di filtro.
  • La funzione sopra indicata invia tramite JQuery Ajax API il dato ad un Web Service.
  • Parsing dell'xml (che contiene i dati filtrati) ritornato dal Web Service.

Partiamo dal creare un Web Service: WSTest.asmx.
Per semplicità il metodo GetDati ritorna un DataSet:

   1: using System;
   2: using System.Data;
   3: using System.Collections.Generic;
   4: using System.Linq;
   5: using System.Web;
   6: using System.Web.Services;
   7:  
   8: namespace WebApplication2
   9: {
  10:   /// <summary>
  11:   /// Summary description for WSTest

  12:   /// </summary>
  13:   [WebService(Namespace = "http://tempuri.org/")]
  14:   [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
  15:   [System.ComponentModel.ToolboxItem(false)]
  16:   // To allow this Web Service to be called from script, using ASP.NET AJAX,   
uncomment the following line.
  17:   // [System.Web.Script.Services.ScriptService]
  18:   public class WSTest : System.Web.Services.WebService
  19:   {
  20:     [WebMethod]
  21:     public DataSet GetDati( string filter)
  22:     {
  23:       //Eseguo le operazioni di filtro e ritorno un DataSet
  24:     }
  25:   }
  26: }

Invece la funzione ajax che si occupa di richiamare il web service e di parserizzare l'xml è la seguente:

   1: function Filter( filterValue) {
   2:     $.ajax({
   3:         type: "POST",
   4:         url: "WSTest.asmx/GetDati",
   5:         data: "filter=" + filterValue,
   6:         dataType: "xml",
   7:         success: function(response) {
   8:             var table = "<table border=\"1\">";
   9:             $("DTDati", response).each(function() {
  10:             var tr = "<tr><td>" + $("Id", this).text() + "</td><td>" + 
$("Desc", this).text() + "</td></tr>";
  11:             table = table + tr;
  12:                 })
  13:             $("#dv").append( table);
  14:             },
  15:             error: function(resp) {
  16:                 alert(resp);
  17:                 }
  18:         });
  19: }

In parole molto semplici la funzione Filter riceve il valore su cui effettuare il filtro. Viene richiamato il metodo GetDati indicato come valore del parametro url. In caso di successo viene lanciata la funzione che accetta un argomento restituito dal server, formattato in base al paramento dataType.
Itero sugli elementi di DTTati (name del DataTable) per generare l'html della tabella da renderizzare.
Dalla pagina Popup.aspx per lanciare la funzione Filter inserisco il codice della riga 4):

   1: <script type="text/javascript">
   2: function SetValue() {
   3:   window.parent.opener.$("#txtValue").val($("#txtReturnValue").val());
   4:   window.parent.opener.Filter($("#txtReturnValue").val());
   5:   $(close());
   6: }
   7: </script>


Come sempre questa soluzione non è certo da considerarsi quella definitiva ma solo come uno spunto.
Infatti si potrebbero apportare delle significative modifiche per migliorare di molto l'esempio come l'uso di JSON in sostituzione dell'xml, l'uso di AJAX Data Controls invece di generare il markup della griglia oppure l'uso di WCF (Windows Communication Foundation) al posto del Web Services.

Read More »»

Monday, November 10, 2008

Link .Net #8

. Monday, November 10, 2008
0 commenti

Eccoci nuovamente con un altro appuntamento di Link .Net:

How to create and Publish your first Windows Azure application
Building applications for Windows Azure

Uno degli annunci più importanti fatti durante la PDC tenutasi a Los Angeles il mese di Ottobre riguarda Windows Azure e Azure Service Platform. Due tutorial per chi vuole iniziare a capirci qualcosina di più dal punto di vista dello sviluppo su questa nuova piattaforma.
Inoltre con Azure Services Training Kit potete trovare altro materiale: esempi, demo, presentazioni ecc.
en

Using Active Directory to authenticate users to your ASP.NET Web Site

I passi su come implementare in una web application Asp.Net l'autenticazione utente tramite Active Directory. en

Autocomplete box accessing a webservice walk-through

Un esempio con tanto di codice sorgente in allegato, su come creare un controllo Autocomplete in Asp.Net con l'ausilio di un webservice. en

iTunes Data Grid Skin

Sempre il grande Matt Berseth ci mostra come applicare un look iTunes al nostro DataGrid. en

XPlorerBar: a WPF Windows XP Style Explorer Bar Control

Un controllo ExplorerBar realizzato in tecnologia WPF. en

Twitter PowerShell Script

Script PowerShell per inserire un post in twitter. en

Read More »»

Thursday, November 6, 2008

Microsoft Chart Controls

. Thursday, November 6, 2008
0 commenti

ChartSamples Alla soluzioni come Visifire, Google Chart, Open Flash Chart aggiungo Microsoft Chart Controls targata appunto Microsoft, che permette di utilizzare in Visual Studio 2008 SP1 il nuovo controllo Chart sia per Asp.Net 3.5 che per Windows Form.

Fonte: Andrea Boschin

Read More »»

Wednesday, November 5, 2008

Insert DataTable in Excel tramite VSTO

. Wednesday, November 5, 2008
2 commenti

VSTO sta per Visual Studio Tools per Office e quindi come si può ben intuire permette di creare soluzioni per Office usando Visual Studio e il .Net Framework.
Ma vediamo subito un semplicissimo esempio.
Il primo passo consiste nel creare un progetto per Office, nella fattispecie ho optato per la versione 2007 utilizzando il template Workbook:
Vsto1
Per semplicità genero un DataTable composto da tre colonne e cento righe:

   1: private DataTable CreateDataTable()
   2: {
   3:   DataTable dt = new DataTable();
   4:   dt.Columns.Add(new DataColumn("Id", typeof(int)));
   5:   dt.Columns.Add(new DataColumn("Desc", typeof(string)));
   6:   dt.Columns.Add(new DataColumn("Date", typeof(DateTime)));
   7:   DataRow row;
   8:   for (int i = 0; i < 100; i++)
   9:   {
  10:     row = dt.NewRow();
  11:     row[0] = i;
  12:     row[1] = "Desc: " + i.ToString();
  13:     row[2] = DateTime.Now.AddDays(i);
  14:     dt.Rows.Add(row);
  15:   }
  16:   return dt;
  17: }

Nell'evento Startup del primo sheet vado a richiamare il metodo precedentemente creato, il resto è un semplice doppio ciclo ( righe, colonne) per popolare le singole celle del foglio Excel:

   1: DataTable dt = CreateDataTable();
   2: for (int r = 1; r <= dt.Rows.Count; r++)
   3:   for (int c = 1; c <= dt.Columns.Count; c++)
   4:     Globals.Sheet1.Cells[r, c] = dt.Rows[r - 1][c - 1];


Per osservare il risultato basta lanciare l'applicazione.
Lo stesso risultato si può ottenere, con un notevole miglioramento dei tempi di esecuzione, attraverso l'oggetto Excel.Range che rappresenta una singola cella o un intervallo di celle:

   1: DataTable dt = CreateDataTable();
   2: Excel.Range rg;
   3: for( int r=1; r<=dt.Rows.Count; r++)
   4: {
   5:   rg = Globals.Sheet1.Range[ Globals.Sheet1.Cells[ r, 1], 
   6:                              Globals.Sheet1.Cells[r, dt.Columns.Count]];
   7:   rg.Value2 = dt.Rows[r-1].ItemArray;
   8: }

A questo punto tramite un semplice test (eseguiti su virtual machine con SO Windows Server 2008) si scende dai 450 millisecondi con il primo metodo ai 310 millisecondi di quest'ultimo.
Il divario diventa molto più rilevante man mano che il numero di righe/colonne del DataTable aumenta.

Read More »»