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