<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Rainbowbreeze &#187; .NET</title>
	<atom:link href="http://www.rainbowbreeze.it/category/tech/net/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.rainbowbreeze.it</link>
	<description>Alfredo Morresi personal website</description>
	<lastBuildDate>Tue, 07 Sep 2010 13:11:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Tema Aero in applicazioni WPF</title>
		<link>http://www.rainbowbreeze.it/tema-aero-in-applicazioni-wpf/</link>
		<comments>http://www.rainbowbreeze.it/tema-aero-in-applicazioni-wpf/#comments</comments>
		<pubDate>Tue, 13 Oct 2009 08:35:28 +0000</pubDate>
		<dc:creator>rainbowbreeze</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Aero]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://www.rainbowbreeze.it/?p=834</guid>
		<description><![CDATA[Il layout grafico Aero, utilizzato di default in Vista, e’ reperibile e usabile anche in applicazioni WPF per Windows XP. Per abilitarlo ci sono diverse strade, alcune a livello di xaml, altre a livello di codice. Abilitazione via XAML Come spiegato da Alessadro, basta includere l’assembly PresentationFramework.Aero.dll tra le risorse dell’applicazione e poi aggiungere queste [...]]]></description>
			<content:encoded><![CDATA[<p>Il layout grafico Aero, utilizzato di default in Vista, e’ reperibile e usabile anche in applicazioni WPF per Windows XP.<br />
Per abilitarlo ci sono diverse strade, alcune a livello di xaml, altre a livello di codice.</p>
<p><strong>Abilitazione via XAML</strong><br />
Come <a title="WPF: Utilizzare il tema Windows Aero in Windows XP" href="http://community.visual-basic.it/alessandro/archive/2007/11/04/20979.aspx" target="_blank">spiegato da Alessadro</a>, basta includere l’assembly <strong>PresentationFramework.Aero.dll</strong> tra le risorse dell’applicazione e poi aggiungere queste righe all’interno del file <strong>App.xaml</strong>, per fare in modo che tutta l’applicazione usi il tema Aero.</p>
<pre class="brush: xml">
<Application.Resources>
	<ResourceDictionary>
		<ResourceDictionary.MergedDictionaries>

		<!-- Impostazione del tema Aero -->
		<ResourceDictionary Source="/PresentationFramework.Aero;V3.0.0.0;31bf3856ad364e35;component/themes/aero.normalcolor.xaml"></ResourceDictionary>

		<!-- Impostazione per i temi personalizzati usati nell'applicativo -->
		<ResourceDictionary Source="pack://application:,,,/ComNet.Retail.UI.WPF.Touch;component/Themes/GlobalStyles.xaml"></ResourceDictionary>

		</ResourceDictionary.MergedDictionaries>
	</ResourceDictionary>
</Application.Resources>
</pre>
<p>Il secondo dizionario che viene usato contiene altri temi aggiuntivi, quindi non e’ indispensabile per abilitare Aero. L’ho messo solo come nota per far vedere come includere e usare stili presi da altri assembly all&#8217;interno dello stesso App.xaml.</p>
<p>Il risultato che si ottiene e&#8217; questo, conservando un look&#8217;nd feel omogeneo tra Windows XP e Windows Vista, contorno della finesta a parte:<br />
<a href="http://www.rainbowbreeze.it/wordpress/wp-content/uploads/2009/10/WPF_Aero_XP21.jpg"><img class="alignnone" style="border: 0pt none; margin: 2px 4px; display: inline;" title="WPF_Aero_XP2" src="http://www.rainbowbreeze.it/wordpress/wp-content/uploads/2009/10/WPF_Aero_XP2_thumb1.jpg" border="0" alt="WPF_Aero_XP2" width="240" height="240" align="bottom" /></a></p>
<p><strong>Abilitazione via codice</strong><br />
Se l&#8217;abilitazione del tema occorre farla via, basta includere queste righe nell’evento OnStartup dell’applicazione, file <strong>App.xaml.cs</strong> e sempre dopo aver referenziato <strong>PresentationFramework.Aero.dll</strong>:</p>
<pre class="brush: csharp">ResourceDictionary aero = new ResourceDictionary();
aero.Source = new Uri("/PresentationFramework.Aero;V3.0.0.0;31bf3856ad364e35;component/themes/aero.normalcolor.xaml", UriKind.RelativeOrAbsolute);
Application.Current.Resources.MergedDictionaries.Add(aero);

ResourceDictionary dict = new ResourceDictionary();
dict.Source = new Uri("/ComNet.Retail.UI.WPF.Touch;component/Themes/GlobalStyles.xaml", UriKind.RelativeOrAbsolute);
Application.Current.Resources.MergedDictionaries.Add(dict);
</pre>
<p>Stesso discorso fatto sopra per i temi aggiuntivi vale anche per la seconda parte di questo snippet, quella importante e’ solo la prima sezione di codice.<br />
<span id="more-834"></span></p>
<p><strong>Abilitazione selettiva via XAML</strong><br />
Si puo’ anche fare in modo che solamente una finestra dell’applicazione utilizzi il tema Aero, mentre il resto del programma continui ad utilizzare il suo tema predefinito.</p>
<pre class="brush: xml">
<Window.Resources>
	<ResourceDictionary>
		<ResourceDictionary.MergedDictionaries>

			<ResourceDictionary Source="/PresentationFramework.Aero;V3.0.0.0;31bf3856ad364e35;component/themes/aero.normalcolor.xaml"></ResourceDictionary>

			<ResourceDictionary>
				<local:TipoRigaConverter x:Key="TipoRigaConverter"></local:TipoRigaConverter>

				<!-- l'override dei colori del listview -->
				<Style x:Key="myListboxStyle">
					<Style.Resources>
						<!-- Background of selected item when focussed -->
						<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Red" />
						<!-- Background of selected item when not focussed -->
						<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Green" />
					</Style.Resources>
				</Style>
			</ResourceDictionary>
		</ResourceDictionary.MergedDictionaries>
	</ResourceDictionary>
</Window.Resources>
</pre>
<p>Anche in questo esempio, ho aggiunto una parte non funzionale all&#8217;impostazione del tema, quella del ResourceDictionary che contiene la dichiarazione del Converter e dello Style. Serve solo per far vedere come mettere tutto assieme all&#8217;interno delle Window.Resources.</p>
<p><strong>Abilitazione selettiva via codice</strong><br />
All’interno del code behind della mia Window, UserControl o altro elemento grafico, basta scrivere:</p>
<pre class="brush: csharp">
ResourceDictionary aero = new ResourceDictionary();
aero.Source = new Uri("/PresentationFramework.Aero;V3.0.0.0;31bf3856ad364e35;component/themes/aero.normalcolor.xaml", UriKind.RelativeOrAbsolute);
this.Resources.MergedDictionaries.Add(aero);
</pre>
<p>Io personalmente utilizzo questo codice nel costruttore dell&#8217;elemento, dopo la chiamata <strong>InizializeComponent()</strong>, ma si puo&#8217; usare dove serve, senza problemi, dipende dall&#8217;uso che viene fatto degli stili all&#8217;interno della window o controllo e se vengono definiti come StaticResource o DynamicResource (rispettivamente prima di InizializeComponent() o un po&#8217; ovunque nell&#8217;inizializzazione del controllo).</p>
<p><strong>Precauzioni varie</strong><br />
Se si vogliono definire ulteriori personalizzazioni all’aspetto dei controlli, bisogna utilizzare l’attributo <strong>BasedOn</strong> nella definizione dello stile, altrimenti si perde l’aspetto Aero. Ad esempio, per definire larghezza e altezza minina di un bottone:</p>
<pre class="brush: xml">
<!-- Stile bottone per essere facilmente spinto in un'intefaccia touch -->
<Style x:Key="TouchInputButtonStyle" TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
	<Setter Property="Width" Value="50"></Setter>
	<Setter Property="Height" Value="30"></Setter>
	<Setter Property="Margin" Value="5"></Setter>
</Style>
</pre>
<p>Questo stile potrebbe essere definito in un file WPF separato ed incluso con gli snippet di codice che facevo vedere sopra.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rainbowbreeze.it/tema-aero-in-applicazioni-wpf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ComInterop in C# e VB.NET</title>
		<link>http://www.rainbowbreeze.it/cominterop-in-c-e-vb-net/</link>
		<comments>http://www.rainbowbreeze.it/cominterop-in-c-e-vb-net/#comments</comments>
		<pubDate>Fri, 10 Jul 2009 23:00:00 +0000</pubDate>
		<dc:creator>rainbowbreeze</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Creazione del progetto .NET di base Dopo essersi letti un po&#8217; di teoria, passiamo alla realizzazione di una vera classe C# da utilizzare all&#8217;interno di un programma VB6. Come specificato nel post precedente, se si utilizza VB.NET c&#8217;e&#8217; gia&#8217; un template di progetto pronto per l&#8217;interoperabilita&#8217;. Utilizzando invece C# (o VB.NET con Visual Studio 2008) [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Creazione del progetto .NET di base</strong></p>
<p>Dopo <a href="index.php?option=com_content&amp;task=view&amp;id=142&amp;Itemid=107" target="_self">essersi letti un po&#8217; di teoria</a>,  passiamo alla realizzazione di una vera classe C# da utilizzare all&#8217;interno di un programma VB6.</p>
<p>Come specificato nel post precedente, se si utilizza VB.NET c&#8217;e&#8217; gia&#8217; un template di progetto pronto per l&#8217;interoperabilita&#8217;. Utilizzando invece C# (o VB.NET con Visual Studio 2008) occorre farsi le cose a manina. Di seguito uno snippet di codice per creare la classe di base.</p>
<pre class="brush: csharp">
using System;
using Microsoft.VisualBasic;

namespace TestRegistazioneCom
{

[ComClass(TestComInterop.ClassId, TestComInterop.InterfaceId, TestComInterop.EventsId)]
public class TestComInterop
{
	public const string ClassId = "233D23FD-68C0-4da6-9749-8E137127692F";
	public const string InterfaceId = "6ACCBB64-3A0A-46ee-B8F8-9537CEBF2136";
	public const string EventsId = "B6A186AB-6212-4ab1-B998-7F471C5AE94B";

	public TestComInterop()
	{
	}

	public string GetName()
	{
		return "RainbowBreeze";
	}
}
}
</pre>
<p>I GUID (quelle lunghe stringe di numeri) vanno cambiati e messi nuovi, magari utilizzando il GUID Generator di Visual Studio (<em>Tools -&gt; Create Guid</em>)</p>
<p><strong> </strong></p>
<p><strong>Configurazione del progetto .NET per l&#8217;interoperabilita&#8217;</strong></p>
<p>Andare nelle proprieta&#8217; del progetto, tab <strong>Application</strong>, bottone <strong>Assembly Information</strong></p>
<p><strong>Title</strong>: il titolo dell&#8217;assembly, viene messo in HKEY_CLASSES_ROOT ed e&#8217; quello che apparira&#8217; come nome della libreria creata<br />
<strong>Description</strong>: la descrizione che apparira&#8217; dentro VB6 quando si andranno ad aggiungere nuove reference<br />
<strong>Version</strong>: la versione con cui la libreria .NET viene registrata<br />
<strong>GUID</strong>: il GUID utilizzato per registrare l&#8217;oggetto all&#8217;interno del registry (HK_CR\TypeLib\). Viene generato automaticamente e deve essere univoco per non sovrapporsi ad altri GUID di altre librerie registrate nel sistema      <strong>Make Assembly COM-visible</strong>: va flaggata questa opzione</p>
<p><span id="more-155"></span></p>
<p><strong>Registrazione della nuova DLL nel sistema</strong></p>
<p>Se nelle proprieta&#8217; del progetto .NET, tab Build, viene impostata la voce &#8220;<strong>Register for Com Interop</strong>&#8220;, quando il progetto viene compilato, Visual Studio pensa anche a generare il relativo tlb (un proxy per VB6 necessario all&#8217;interoperabilita&#8217;) e registrarlo all&#8217;interno del sistema. Se questo puo&#8217; sembrare un comodo automatismo, in realta&#8217;  va bene solo per la macchina di sviluppo, dato che il tlb viene generato all&#8217;interno della cartella <em>bin\debug</em> o <em>bin\release</em> del progetto e registrato in quel percorso.</p>
<p>Nella macchina di deploy, occorre registrare manualmente il tlb generato, per mezzo del comando <em>regasm.exe</em>: copiare la dll .NET nella cartella dove andra&#8217; a finire in maniera definitiva, e poi eseguire il comando regasm per generare il tlb e registrarlo nel sistema. Ponendo che la classe da registrare si chiami <em>TestRegistrazioneCom.dll</em>, la sintassi del regasm sara&#8217;:</p>
<p><em>regasm TestRegistrazioneCom.dll /tlb:TestRegistrazioneCom.tlb</em></p>
<p>Come ultimo passo, occorre registrare la DLL .NET della GAC (Global Assembly Cache), in modo che il tlb sappia chi chiamare quando i suoi metodi vengono invocati. In alternativa, si puo&#8217; anche lasciare la dll .NET nella stessa cartella dell&#8217;eseguibile VB6, senza bisogno di registrazioni nella GAC.</p>
<p><strong>Utilizzi avanzati</strong></p>
<p>Se si vuole costruire una nuova classe .NET che deve pero&#8217; mantenere la compatibilita&#8217; con un precedente oggetto COM, andandolo a sostituire in maniera trasparente alle applicazioni che lo utilizzano, si puo&#8217; agire sul GUID e sul Title del nuovo progetto .NET, impostandoli come quelli della classe da sostituire. Occorrera&#8217; poi accertarsi che anche i metodi esposti siano gli stessi. Con questa attenzione, basta deregistrare la vecchia libreria VB6 e registrare la nuova libreria .NET e tutto dovrebbe andare.</p>
<p>Altre guide che parlano della COM Interop, invece di registrare direttamente la classe .NET concreta,<a title="CodeProject.com - C# Com" href="http://www.codeproject.com/KB/vb-interop/csCom.aspx" target="_blank"> registrano un&#8217;interfaccia</a>, che poi la classe .NET va ad implementare.<br />
Mi sembra una soluzione piu&#8217; pulita, ma alla fine ogni soluzione ha il suo contesto corretto.</p>
<p>References:<br />
<a title="Interop Forms Toolkit 2.0 Tutorial" href="http://www.codeproject.com/KB/vb-interop/VB6InteropToolkit2.aspx" target="_blank">Interop Forms Toolkit 2.0 Tutorial</a> &#8211; assolutamente da leggere<br />
<a title="VB6 Interop - Bringing VB6 into the .NET fold" href="http://www.codeproject.com/KB/vb-interop/" target="_blank">VB6 Interop &#8211; Bringing VB6 into the .NET fold</a><br />
<a title="Using .NET Controls in VB6" href="http://www.codeproject.com/KB/vb-interop/UsingDotNETControlsInVB6.aspx" target="_blank">Using .NET Controls in VB6</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.rainbowbreeze.it/cominterop-in-c-e-vb-net/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Pattern per la localizzazione delle applicazioni WinForm, ASP.NET e WPF</title>
		<link>http://www.rainbowbreeze.it/pattern-per-la-localizzazione-delle-applicazioni-winform-asp-net-e-wpf/</link>
		<comments>http://www.rainbowbreeze.it/pattern-per-la-localizzazione-delle-applicazioni-winform-asp-net-e-wpf/#comments</comments>
		<pubDate>Fri, 23 Jan 2009 08:25:44 +0000</pubDate>
		<dc:creator>rainbowbreeze</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Misc]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[ASP.Net]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Quando si sviluppa un&#8217;applicazione che potrebbe essere usata in diverse parti del mondo, occorre prevedere una localizzazione dell&#8217;interfaccia. Se tratta quindi di mostrare componenti, messaggi e altre parti del programma nella giusta lingua. Certo, ci sono molti altri problemi da affrontare quando si parla di localizzazione, ma l&#8217;interfaccia e&#8217; quello che, a mio avviso, tra [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" style="border: 0px solid #000000; margin: 2px 4px; width: 200px; height: 132px;" title="Localization of .NET applications" src="/site-media/blog-images/2009-images/localization.jpg" alt="Localization of .NET applications" width="200" height="132" />Quando si sviluppa un&#8217;applicazione che potrebbe essere usata in diverse parti del mondo, occorre prevedere una <strong>localizzazione dell&#8217;interfaccia</strong>. Se tratta quindi di mostrare componenti, messaggi e altre parti del programma nella giusta lingua. Certo, ci sono molti altri problemi da affrontare quando si parla di localizzazione, ma l&#8217;interfaccia e&#8217; quello che, a mio avviso, tra tutti richiede il maggior tempo per gestito.</p>
<p>Non esiste un metodo universalmente riconosciuto e usato per fare tutto questo in .NET, anche se ci sono strumenti e pattern più o meno complessi il cui uso e&#8217; pertinente a determinate situazioni.</p>
<h4>WINFORM &#8211; LA VIA FACILE</h4>
<p>L&#8217;articolo MSDN relativo e&#8217; questo: <a title="Walkthrough: Localizing Windows Forms " href="http://msdn.microsoft.com/en-us/library/y99d1cd3(VS.80).aspx" target="_blank">Walkthrough: Localizing Windows Forms</a>.<br />
In pratica, se occorre localizzale label, menu e altri elementi di un form, il compito e&#8217; semplice e viene fatto tutto grazie all&#8217;editor di Visual Studio. Si disegna la propria finestra e si impostano tutte le etichette standard, quelle che devono apparire di default. Si passano poi a definire le traduzioni per un certo linguaggio impostando la proprieta&#8217; <em>Language</em> del form e modificando le etichette dei controlli. Il sistema, in fase di esecuzione dell&#8217;applicativo, provvedera&#8217; a selezionare uno dei linguaggi personalizzati basandosi su quello del sistema. Se invece si vuole impostare una lingua, occorre agire su <em>Thread.CurrentThread.CurrentUICulture</em>. Tutto funziona grazie ad un file di risorse, creato automaticamente dall&#8217;editor, per ogni finestra  / controllo che localizzo con questo medoto.<br />
Approccio molto simile per ottenere delle stringhe localizzate, utili per MessageBox e altre informazioni da mostrare all&#8217;utente. Si crea un file delle risorse (quello di default e quelli specifici per le lingue gestite), si inseriscono in questi file le coppie chiave/valore (nel valore c&#8217;e&#8217; il testo tradotto) e poi da codice si usa un ResourceManager, legato al file delle risorse creato, per ottenere i valori delle chiavi richieste in base alla cultura corrente.<br />
<strong>Pro</strong> di questo metodo l&#8217;estrema <strong>facilita&#8217; di implementazione</strong> e la scrittura di poco codice, <strong>contro</strong> il fatto che occorre <strong>ricompilare e ridistribuire il progetto</strong> ad ogni cambiamento dei testi e che le risorse localizzate non risiedono in un unico punto ma sono sparse all&#8217;interno dell&#8217;applicazione.</p>
<p>Per localizzare anche i componenti che mostrano date e valute, occorre agire su <em>Thread.CurrentThread.CurrentCulture</em>, seguendo quanto scritto in <a title="How to: Set the Culture and UI Culture for Windows Forms Globalization" href="http://msdn.microsoft.com/en-us/library/b28bx3bh(VS.80).aspx" target="_blank">How to: Set the Culture and UI Culture for Windows Forms Globalization</a>.</p>
<h4>ASP.NET &#8211; RESOURCE PROVIDER PER TUTTI</h4>
<p><a title="ASP.NET 2.0 Localization Features: A Fresh Approach to Localizing Web Applications" href="http://msdn.microsoft.com/en-us/library/ms379546(VS.80).aspx" target="_blank">ASP.NET 2.0 Localization Features: A Fresh Approach to Localizing Web Applications</a>: l&#8217;articolo di riferimento da leggere per la localizzazione delle applicazioni un ASP.NET 2.0<br />
<a title="Introduction to Localization in ASP.NET 2.0" href="Introduction%20to%20Localization%20in%20ASP.NET%202.0" target="_blank">Introduction to Localization in ASP.NET 2.0</a>: questo articolo, che attinge a larga mano dal precedente, espone alcuni concetti di base della localizzazione in ASP.NET 2.0, parlando di assembly delle risorse (gli stessi utilizzati in maniera trasparente nell&#8217;approccio WinForm precedente), spiega come impostare una pagina in base alla lingua predefinita nel browser dell&#8217;utente, fa una panoramica su risorse globali (<em>GetGlobalResourceObject</em>) e risorse locali (<em>GetLocalResourceObject</em>), su come funziona il <em>Resource Fallback</em>, su come assegnare via markup code il testo dei controlli nella pagina asp grazie alle <em>Implicit</em> ed <em>Explicit Resource Expressions</em>.</p>
<p><strong>Punti di debolezza</strong> di questi approcci, il fatto che <strong>i resource file sono gestiti automaticamente</strong> e non si possono condividere, ad esempio, con una versione WinForm della stessa applicazione. Inoltre, come il precedente, <strong>ogni cambiamento delle risorse necessita di una ricompilazione e ridistribuzione</strong> di parti dell&#8217;applicazione.</p>
<p><span id="more-135"></span></p>
<h4>WINFORM e ASP.NET &#8211; GESTIONI PIU&#8217; COMPLESSE</h4>
<p>Se l&#8217;uso dei file di risorse dell&#8217;applicazione non e&#8217; quello che si vuole usare, perche&#8217; magari le traduzioni devono risiedere su un database oppure devono essere distribuite attraverso file xml, se occorre tenere in considerazione l&#8217;orientamento del testo della cultura scelta nel disegno del form, se per ognuna occorre anche ridimensionare label e textbox o cambiare immagini e colori, allora le due precedenti &#8220;via facili&#8221; non sono piu&#8217; sufficienti.</p>
<p>Fortunatamente ASP.NET offre la possibilita&#8217; di definire dei <strong>custom resource provider</strong>, in grado di accedere alle risorse fuori dall&#8217;ambito dell&#8217;<em>App_GlobalResources</em> e dell&#8217;<em>App_LocalResources</em>. Ad esempio alimentandosi da un database o da un assembly esterno.<br />
<a title="Extending the ASP.NET 2.0 Resource-Provider Model" href="http://msdn.microsoft.com/en-us/library/aa905797.aspx" target="_blank">Extending the ASP.NET 2.0 Resource-Provider Model</a> mostra come implementare un proprio <strong>Database Resource Provider</strong>, prestando attenzione a fattori come il resource fallback, il caching, l&#8217;accesso multithreading al database e l&#8217;impostazione dellla sezione <em>&lt;globalization&gt;</em> del <em>Web.config</em> per usare il proprio resource provider. Segue anche una trattazione per attingere i dati da un assembly esterno. per la lettura dei dati.<br />
<a title="Creating a Data Driven ASP.NET Localization Resource Provider and Editor" href="http://www.west-wind.com/presentations/wwDbResourceProvider/" target="_blank">Creating a Data Driven ASP.NET Localization Resource Provider and Editor</a>: seguendo l&#8217;approccio del precedente articolo, viene costruito un Database Resource Provider ed un <a title="wwDbResourceProvider" href="http://www.west-wind.com/tools/wwDbResourceProvider/" target="_blank">editor ASP.NET</a> per modificare agevolmente le risorse. Trattazione esplicita e molti esempi di codice, con la definizione completa  e puntuale di tutto quello che va implementato.</p>
<p>Per quanto rigurda le applicazioni WinForm invece non esiste un approccio standard alla risoluzione di questi problemi, e occorre fare molte cose via codice esplicito, creandosi il proprio dizionario dove contenere le traduzioni localizzate, modificare attraverso il codice label, titoli, posizioni e quant&#8217;altro occorre considerare per la cultura corrente.<br />
Oppure passara a WPF.</p>
<h4>LOCALIZZAZIONE IN WINDOWS PRESENTATION FOUNDATION (WPF)</h4>
<p>Il discorso si fa ampio e complesso perchè WPF e&#8217; pensato per la localizzazione piu&#8217; totale, quindi sono molte le possibilità offerte, ognuna con i suoi pro e contro e con determinati aspetti tenuti in considerazione: verso di scrittura, (sinistra-destra oppure destra-sinistra) grandezza dei controlli che si devono o non devono autoridimensionare a secondo del testo in essi contenuto.<br />
cultura di fallback, quella cioe&#8217; da usare se non esiste la specifica cultura impostata nel sistema operativo in uso,  l&#8217;uso del tag <a title="xml:lang Handling in XAML" href="http://msdn.microsoft.com/en-us/library/ms788730.aspx" target="_blank">Xml:lang</a>, possibilita&#8217; di modificare a runtime la cultura usata. I risultati, comunque, sono abbastanza semplici da ottenere.</p>
<p>Un po&#8217; di <strong>teoria</strong>:<br />
<a title="WPF Globalization and Localization Overview" href="http://msdn.microsoft.com/en-us/library/ms788718.aspx" target="_blank">WPF Globalization and Localization Overview</a>: best practices nel disegno di interfacce multilinguaggio, definizione di un <em>language-neutral main assembly</em> per il progetto e dei <em>language-dependent satellite resource assembly</em> dove inserire le proprie risorse localizzate. Utilizzo del tag Uid negli elementi del file xaml.<br />
<a title="Globalization for the Windows Presentation Foundation" href="http://msdn.microsoft.com/en-us/library/ms745650.aspx" target="_blank">Globalization for the Windows Presentation Foundation</a>: Aggiunge, rispetto al precedente, qualche raccomandazione per l&#8217;uso di ClickOnce</p>
<p>Ed alcuni <strong>esempi hands-on</strong>:<br />
<a title="Globalization and Localization Samples" href="http://msdn.microsoft.com/en-us/library/ms771320.aspx" target="_blank">Globalization and Localization Samples</a>: una serie di esempi tratti dalla MSDN che fanno vedere varie tecniche di localizzazione focalizzate su piccole e semplici tematiche.<br />
<a title="WPF Multi-Lingual at Runtime" href="http://www.codeproject.com/KB/WPF/WPF-Mulit-Lingual.aspx" target="_blank">WPF Multi-Lingual at Runtime</a>: localizzazione delle stringhe di un xaml mediante file xml. Soluzione semplice per situazioni semplici, la lettura del primo commento &#8220;My favorite approach&#8221; suggerisce come alleggerire un po&#8217; il file xml e lo xaml.<br />
<a title=" Localizing WPF Applications using Locbaml" href="http://www.codeproject.com/KB/WPF/WPFUsingLocbaml.aspx" target="_self">Localizing WPF Applications using Locbaml</a>: in realta&#8217; tre articoli in uno, questo esauriente tutorial si approccia alla locazzazione di un&#8217;applicazione WPF seguendo tre diverse strade: la prima utilizza il <em>Resources.resx</em>, la classe <em>Properties.Resources</em> e un po&#8217; di sano binding nello xaml. La seconda invece crea delle <em>satellite dll</em>, usa gli Uid degli elementi dello xaml, usa <em>MSBuild.exe</em> e <a title="How to: Localize an Application" href="http://msdn.microsoft.com/en-us/library/ms746621.aspx" target="_blank"><em>LocBaml.exe</em></a> e altri concetti. La terza e&#8217; un&#8217;ulteriore raffinazione della seconda tecnica. Personalmente ho trovato il primo approccio semplice e abbastanza utile. Inoltre, non ho neanche dovuto ridefinire il <em>ResXFileCodeGenerator</em> grazie al commento &#8220;<em>Found I didn&#8217;t need the custom code generator</em>&#8220;, ho notato che l&#8217;editor xaml di Visual Studio 2008 offre pieno supporto a questo approccio, senza i problemi che ha avuto l&#8217;autore. Occorre pero&#8217; correggere il contenuto del tag &lt;Button&gt; sostituendo la stringa<br />
<em>&#8220;{x:Static properties:Resources.MainButtonText}&#8221;</em><br />
con la stringa<br />
<em>&lt;TextBlock TextAlignment=&#8221;Center&#8221; Text=&#8221;{x:Static properties:Resources.MainButtonText}&#8221;/&gt;</em></p>
<p><a title="Real-Time Multilingual WPF Demo" href="http://www.codeproject.com/KB/WPF/realtime_multilingual.aspx" target="_blank">Real-Time Multilingual WPF Demo</a>: un progetto che si appoggia sul servizio di traduzione online offerto da Google per ottenere on-the-fly le stringhe da tradurre in base ad un linguaggio di origine e uno di destinazione impostabili a runtime. Prevede anche l&#8217;uso di una <em>custom markup extension</em> per rendere più facile da scrivere il codice xaml.</p>
<p>Ci sono poi delle <strong>librerie</strong> che permettono di usare altri modi di gestire la localizzazione di stringhe e immagini, senza dover usare LocBaml, file di risorse ed altro.<br />
<a title="WPF Localization by Tomer Shamam" href="http://blogs.microsoft.co.il/blogs/tomershamam/archive/2007/10/30/wpf-localization-on-the-fly-language-selection.aspx" target="_blank">WPF Localization by Tomer Shamam</a>:<br />
i dizionari usati per le traduzioni possono essere creati in maniera disaccoppiata dalla forma di persistenza, potendo quindi usare xml, database o altro, prevede l&#8217;utilizzo di parametri bindabili nelle stringe localizzate ed e&#8217;<br />
inclusa anche una markup language extension per rendere piu&#8217; elegante e semplice la scrittura dello xaml. Permette di bindare qualunque<br />
attributo dei controlli, ad esempio la larghezza di una label, nel codice viene mostrato come usare diverse immagini a secondo della lingua usata. Gestiti i valori di default, <span id="ctl00_ctl00_MasterContent_Content_wikiSourceLabel">update automatico delle proprieta&#8217; localizzate dei controlli a runtime</span>, supportati i DataTemplate ma non la localizzazione dei ContextMenu.<br />
<span id="ctl00_ctl00_MasterContent_Content_wikiSourceLabel"><a title="WPF LocalizeExtension" href="http://www.codeplex.com/WPFLocalizeExtension" target="_blank">WPF LocalizeExtension by SeriousM</a></span><span id="ctl00_ctl00_MasterContent_Content_wikiSourceLabel">: utilizza file di risorse (<em>.resx</em>) per memorizzare i contenuti da localizzare, senza passare quindi per le satellite dll e supportando il .resx-fallback mechanism (en-us -&gt; en -&gt; independent culture). Custom markup extension per la scrittura semplificata dello XAML, possibilita&#8217; di visualizzare un certo linguaggio a design-time, update automatico delle proprieta&#8217; localizzate dei controlli a runtime, gestione del binding anche nel code behind, la chiave per collegare la risorsa localizzata e&#8217; composta da <em>assembly:nomerisorsaresx:chiave</em>. Libreria potente, una scelta obbligata se volete far uso dei file resx.<br />
</span><a title="WPF application localization kit by Taggersoft" href="http://blog.taggersoft.com/2008/07/wpf-application-localization-pattern_29.html" target="_blank">WPF application localization kit by Taggersoft</a>: terza soluzione del gruppo, c&#8217;e&#8217; un buon tutorial che ne spiega l&#8217;utilizzo, ma le localizzazioni devono risiedere necessariamente su di uno XAML based ResourceDictionary e non e&#8217; cosi&#8217; potente come le precedenti.<a title="WPF Localization by Tomer Shamam" href="http://blogs.microsoft.co.il/blogs/tomershamam/archive/2007/10/30/wpf-localization-on-the-fly-language-selection.aspx" target="_blank"><br />
</a></p>
<p>Personalmente per le mie applicazioni WPF utilizzero&#8217; la libreria di SeriosM, con qualche piccola modifica, in modo da avere le traduzioni residenti sul db e poterle cosi&#8217; gestire in maniera molto flessibile.</p>
<h4>CONCLUSIONI</h4>
<p>La trattazione dell&#8217;argomento non puo&#8217; essere esaustiva, dato che nuovi pattern possono essere implimentati a secondo dei propri bisogni. Voglio comunque segnalare alcuni strumenti che possono aiutare in questo compito, come ad esempio <a title="RGreatEx" href="http://www.safedevelop.com/Products/RGreatEx/" target="_blank">RGreatEx</a>, un plugin a pagamento per Visual Studio che identifica le stringhe di testo e ne fa il rafactoring in file di risorse, controlla inoltre se sono state localizzate per tutte le lingue, traduce automaticamente una stringa appoggiandosi su servizi online e molto altro. Oppure un breve snippet di codice per accedere ad una risorsa in una satellite dll: <a title="How to: Access Resources in Satellite DLLs" href="http://msdn.microsoft.com/en-us/library/ms165653.aspx" target="_blank">How to: Access Resources in Satellite DLLs</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rainbowbreeze.it/pattern-per-la-localizzazione-delle-applicazioni-winform-asp-net-e-wpf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Usare controlli COM in .NET</title>
		<link>http://www.rainbowbreeze.it/usare-controlli-com-in-net/</link>
		<comments>http://www.rainbowbreeze.it/usare-controlli-com-in-net/#comments</comments>
		<pubDate>Tue, 17 Jun 2008 13:42:52 +0000</pubDate>
		<dc:creator>rainbowbreeze</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[I &#8220;vecchi&#8221; controlli realizzati usando dal tecnologia Microsoft COM (Component Object Model), hanno sicuramente cavalcato gli incubi di molti programmatori, fino a creare quell&#8217;universo di dolore parallelo chiamato DLL Hell, ben noto a chi ha sviluppato con Windows 95, 98, ME, NT, 2000 e forse forse anche XP. Insomma, prima dell&#8217;introduzione del .NET Framework. Purtroppo [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" style="margin: 5px; width: 253px; height: 300px;" title="20080617-com.png" src="/site-media/blog-images/2008-images/20080617-com.png" alt="20080617-com.png" width="253" height="300" /><br />
I &#8220;vecchi&#8221; controlli realizzati usando dal tecnologia <a href="http://www.microsoft.com/com/default.mspx" target="_blank">Microsoft COM</a> (<a href="http://en.wikipedia.org/wiki/Component_Object_Model" target="_blank">Component Object Model</a>), hanno sicuramente cavalcato gli incubi di molti programmatori, fino a creare quell&#8217;universo di dolore parallelo chiamato <a href="http://en.wikipedia.org/wiki/DLL_hell" target="_blank">DLL Hell</a>, ben noto a chi ha sviluppato con Windows 95, 98, ME, NT, 2000 e forse forse anche XP. Insomma, prima dell&#8217;introduzione del .NET Framework.</p>
<p>Purtroppo però <a title="The End of DLL Hell - MSDN" href="http://msdn.microsoft.com/en-us/library/ms811694.aspx" target="_blank">non sembrano del tutto morti e sepolti</a>, anche perchè hanno dalla loro uno streminato partimonio di software binario scritto proprio in COM, e la loro riprogettazione per .NET si puo&#8217; rivelare un spesa non banale da affrontare.</p>
<p>Ecco perchè risulta utile, delle volte, realizzare dei wrapper che permettano di utilizzare questi controlli anche all&#8217;interno di applicazioni .NET, procrastinando magari il giorno in cui veranno sostituiti del tutto e realizzando nel frattempo, grazie alla OOP, un buon layering delle proprie applicazioni, cosi&#8217; quel giorno non fara&#8217; poi tanta paura, Murphy permettendo. Ma anche la possibilita&#8217; di <strong>usare fiammanti controlli .NET in vetuste applicazioni COM</strong>-enable ha il suo fascino, potendo cosi&#8217; aggiornarle un pezzo alla volta, riutilizzando poi buonaparte del lavoro fatto.</p>
<p>Le tecniche di programmazione che studiano queste tematiche vanno sotto il nome di <strong>&#8220;.NET COM Interoperability&#8221;</strong>, ed hanno lo scopo di realizzare <span style="font-size: 10pt; font-family: Verdana,Arial,Helvetica,sans-serif">dei <strong>Runtime-Callable Wrappers</strong> (<strong>RCW</strong>: COM -&gt; .NET) e dei </span><span style="font-size: 10pt; font-family: Verdana,Arial,Helvetica,sans-serif"><strong>COM-Callable Wrappers</strong> (<strong>CCW</strong>: .NET -&gt; COM)</span><span style="font-size: 10pt; font-family: Verdana,Arial,Helvetica,sans-serif">. Viene anche affrontato come gestire gli eventi e i dati di ritorno generati dal controllo inglobato.</span></p>
<p><span id="more-109"></span></p>
<p><a title="How to call a Visual Basic .NET or Visual Basic 2005 assembly from Visual Basic 6.0" href="http://support.microsoft.com/kb/817248" target="_blank">How to call a Visual Basic .NET or Visual Basic 2005 assembly from Visual Basic 6.0</a>: come usare controlli .NET in applicazioni COM, quelle classiche di Visual Basic 6.</p>
<p><a title=".NET Interoperability: COM Interop" href="http://www.blong.com/Conferences/BorConUK2002/Interop2/COMNetInterop.htm" target="_blank">.NET Interoperability: COM Interop</a>: un&#8217;esauriente trattazione di Brian Long sulla creazione di RCW e CCW.</p>
<p><a title="COM Interop in VB.NET" href="http://www.vbdotnetheaven.com/Articles/ArticleListing.aspx?SectionID=2&amp;SubSectionID=98" target="_blank">COM Interop in VB.NET</a>: La sezione sulla COM INterop di VB.Net Heaven, con diversi articoli interessanti.</p>
<p>Visual Basic &amp; .NET Journal, edizione italiana, numeri 69 e 71 del 2006.</p>
<p><a title="Troubleshooting .NET Interoperability" href="http://msdn.microsoft.com/en-us/library/aa289520(VS.71).aspx">Troubleshooting .NET Interoperability</a>: ovviamente problemi e casi particolari ci sono sempre!</p>
<p><a title="BUG: &quot;InteropServices.COMException&quot; error message occurs when you pass ByRef Parameters by using late binding" href="http://support.microsoft.com/default.aspx?scid=kb;en-us;815633" target="_blank">BUG: &#8220;InteropServices.COMException&#8221; error message occurs when you pass ByRef Parameters by using late binding</a>: il titolo e&#8217; gia&#8217; abbastanza esaustivo.</p>
<p><a title="IntelliSense Features Do Not Appear in Visual Basic 6.0 for .NET COM Interop Components" href="http://support.microsoft.com/?id=813809" target="_blank">IntelliSense Features Do Not Appear in Visual Basic 6.0 for .NET COM Interop Components</a> : ancora qualche suggerimento per risolvere problemi comuni.</p>
<p><a title="Improving Interop Performance" href="http://msdn.microsoft.com/en-us/library/ms998551.aspx?lc=1033">Improving Interop Performance</a>: consigli utili su come miglioare le performance quando si ha a che fare con RCW, occupazione di memoria, early e late bindin.</p>
<p>Buon reciclo di codice, a questo punto!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rainbowbreeze.it/usare-controlli-com-in-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Conversione di date e numeri location aware</title>
		<link>http://www.rainbowbreeze.it/conversione-di-date-e-numeri-location-aware/</link>
		<comments>http://www.rainbowbreeze.it/conversione-di-date-e-numeri-location-aware/#comments</comments>
		<pubDate>Sat, 17 May 2008 10:01:44 +0000</pubDate>
		<dc:creator>rainbowbreeze</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Mi e&#8217; capitato di dover salvare alcune informazioni, contenenti numeri e date, in un file di testo per poi rileggerle con un altro programma. Tutto fattibile e semplice utilizzando il metodo .ToString(), se non che l&#8217;altro programma , quello che doveva leggere i dati, aveva delle impostazioni regionali (Regional Settings) diverse dal programma che salvava [...]]]></description>
			<content:encoded><![CDATA[<p>Mi e&#8217; capitato di dover salvare alcune informazioni, contenenti numeri e date, in un file di testo per poi rileggerle con un altro programma.</p>
<p>Tutto fattibile e semplice utilizzando il metodo .ToString(), se non che l&#8217;altro programma , quello che doveva leggere i dati, aveva delle impostazioni regionali (<em>Regional Settings</em>) diverse dal programma che salvava i dati. Le date erano nel formato mese/giorno/anno sul primo, giorno/mese/anno sul secondo, i numero avevano come separatore decimale il punto sul primo, la virgola nel secondo. Le conversioni quindi sballavano tutte.</p>
<p>Ho risolto forzando il salvataggio e la lettura in un formato unico, ecco come.</p>
<p><strong>Salvataggio dei dati</strong>:</p>
<pre class="brush: csharp">
double dblAmount;
string[] arrTextToSave;</code>

System.Globalization.CultureInfo ci = System.Globalization.CultureInfo.CurrentUICulture;
objFormatProvider = (System.Globalization.NumberFormatInfo)
ci.NumberFormat.Clone();
objFormatProvider.NumberDecimalSeparator = ".";

arrTextToSave new string[2] { DateTime.Now.ToString("yyyy/MM/dd"),
dblAmount.ToString</code><code>(objFormatProvider) };
</pre>
<p><span id="more-71"></span></p>
<p><strong>Lettura dei dati</strong>:</p>
<pre class="brush: csharp">
DateTime dtTransactionDate;
double dblAmount;

dtTranscationDate = Convert.ToDateTime(arrTextToSave[0]);
dblAmount = Convert.ToDouble(<code>arrTextToSave</code><code>[1], _objFormatProvider);
</pre>
<p>Cosi', grazie a <a href="http://www.codeproject.com/KB/cs/floatparse.aspx" target="_blank">Vlad Tepes</a> e a <a href="http://geekswithblogs.net/dtotzke/articles/24573.aspx" target="_blank">Totzkeeeeee</a>, ho risolto tutti i problemi anche per il .NET Compat Framework!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rainbowbreeze.it/conversione-di-date-e-numeri-location-aware/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Databinding di controlli in .NET Compact Framework</title>
		<link>http://www.rainbowbreeze.it/databinding-di-controlli-in-net-compact-framework/</link>
		<comments>http://www.rainbowbreeze.it/databinding-di-controlli-in-net-compact-framework/#comments</comments>
		<pubDate>Sun, 04 May 2008 22:52:06 +0000</pubDate>
		<dc:creator>rainbowbreeze</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Il databinding nel .NET Framework e&#8217; di una grande utilita&#8217; senza dubbio. Qui una panoramica su come utilizzarlo nelle proprie applicazioni. Un problema da affrontare una volta cambiati i dati nell&#8217;oggetto con le informazioni (list, collection, datatable ecc), e&#8217; quello di aggiornare il controllo a cui esso e&#8217; collegato. Ci sono varie strade per farlo, [...]]]></description>
			<content:encoded><![CDATA[<p>Il <a href="http://www.akadia.com/services/dotnet_databinding.html" target="_blank">databinding</a> nel .NET Framework e&#8217; di una grande utilita&#8217; senza dubbio. <a href="http://69.10.233.10/KB/miscctrl/databinding_tutorial.aspx" target="_blank">Qui una panoramica</a> su come utilizzarlo nelle proprie applicazioni.</p>
<p>Un problema da affrontare una volta cambiati i dati nell&#8217;oggetto con le informazioni (list, collection, datatable ecc), e&#8217; quello di aggiornare il controllo a cui esso e&#8217; collegato. Ci sono varie strade per farlo, ma quella che preferisco usare passa per l&#8217;uso del <a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.currencymanager.aspx" target="_blank">CurrencyManager</a>.</p>
<p>Segue un breve esempio:</p>
<p><span id="more-76"></span></p>
<p><code>public class CListElement<br />
{<br />
public long ID;<br />
public string Description;</code></p>
<p>public CListElement(long newID, string newDesc)<br />
{<br />
ID = newID;<br />
Description = newDesc;<br />
}<br />
}</p>
<p><code>[...]</code></p>
<p><code>//crea il databinding<br />
List&lt;CListItem&gt; _lstItem;<br />
_lstItems = new List&lt;CListElement&gt;();<br />
_lstItems.Add(new CListElement(10, "Prova 1"));<br />
_lstItems.Add(new CListElement(20, "Prova 2"));<br />
listBox1.DataSource = _lstItems;<br />
listBox1.ValueMember = "ID";<br />
listBox1.DisplayMember = "Description";</code></p>
<p><code>[...]</code></p>
<p><code>//aggiorna il databinding<br />
_lstItems.Add(new CListElement(30, "Prova 3"));<br />
CurrencyManager cm = (CurrencyManager)this.BindingContext[listBox1.DataSource];</p>
<p>cm.Refresh();</code></p>
<p>Questo metodo, rispetto ad altri (come ad esempio riassegnare la proprieta&#8217; DataSource del listbox o combobox), mantiene anche l&#8217;elemento attualmente selezionato nel listbox o combobox.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rainbowbreeze.it/databinding-di-controlli-in-net-compact-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Impostare correttamente il MappingName del DataGridTableStyle di un DataGrid</title>
		<link>http://www.rainbowbreeze.it/impostare-correttamente-il-mappingname-del-datagridtablestyle-di-un-datagrid/</link>
		<comments>http://www.rainbowbreeze.it/impostare-correttamente-il-mappingname-del-datagridtablestyle-di-un-datagrid/#comments</comments>
		<pubDate>Fri, 07 Mar 2008 16:34:03 +0000</pubDate>
		<dc:creator>rainbowbreeze</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Nella programmazione, soprattutto quando si tratta di usare framework evoluti come pu&#242; essere il .NET, ci sono stupidate che per&#242; fanno perdere anche ore di scervellamenti vari. E&#8217; il caso del datamapping, pi&#249; specificatamente il datamapping di una GridView. Infatti questo potente controllo permette di crearsi pi&#249; stili da usare al momento opportuno per cambiare [...]]]></description>
			<content:encoded><![CDATA[<p>
Nella programmazione, soprattutto quando si tratta di usare framework evoluti come pu&ograve; essere il .NET, ci sono stupidate che per&ograve; fanno perdere anche ore di scervellamenti vari.
</p>
<p>
E&#8217; il caso del datamapping, pi&ugrave; specificatamente il datamapping di una GridView. Infatti questo potente controllo permette di crearsi pi&ugrave; stili da usare al momento opportuno per cambiare a volo la visualizzazione dei dati dell&#8217;oggetto bindato, senza scrivere tonnellate di codice. Ogni stile per&ograve; va collegato ad un oggetto al quale verr&agrave; applicato tramite la proprieta&#8217; <i>DataGridTableStyle.MappingName</i>. Nel caso in cui alla DaraGrid sia bindata una DataTable o un DataSet pochi problemi, basta specificare il nome della Table da visualizzare. Ma se viene bindato ad una Collection, List o un proprio oggetto che implementa l&#8217;intefaccia IList, che cosa bisogna mettere?
</p>
<p><span id="more-103"></span>
<p>
La risposta arriva da Daniel Herling, l&#8217;uomo Microsoft del DataGrid. In pratica, occorre conoscere il &quot;nome&quot; dell&#8217;oggetto da mappare, e questo nome lo si ricava in due modi:
</p>
<ul>
<li>If you bind to an ITypedList (say, System.Data.DataTable) then the mapping name should be ITypedList::GetListName(). For a System.Data.DataTable this would be the name of the data table.</li>
<li>If you don&rsquo;t bind to an IList that is not ITypedList then the mapping name should be list.GetType().Name where list is the list the data grid is bound to.&nbsp;</li>
</ul>
<p>
Nel mio caso, per bindare una List tipizzata, ho usato
</p>
<p><samp><code>ts.MappingName = &quot;List`1&quot;</code><br />
</samp></p>
<p>
La <a href="http://www.sellsbrothers.com/news/showTopic.aspx?ixTopic=1060" target="_blank">soluzione completa qui</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rainbowbreeze.it/impostare-correttamente-il-mappingname-del-datagridtablestyle-di-un-datagrid/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
