venerdì 27 maggio 2011

Telerik - Assegnare un DataSource ad un subReport

C# 4.0

In un report generato con un controllo Telerik (Reporting Q3 2010), oltre alla testata c’è il dettaglio in quale è “binding” ad un oggetto .NET. Si deve quindi passare il valore di tale oggetto a run-time prima del rendering del report.
Il report principale si chiama “Invoice” ed il dettaglio è costituito dal subReport “InvoiceDetail” il quale ha come DataSource l’ObjectDataSource: DocumentDetail.
DocumentDetail è quindi un oggetto le cui proprietà vanno a definire il dettaglio del report per esempio il controllo TextBox con il codice del prodotto ha il seguente Value:  “ =Fields.ItemCode”

Resta quindi da assegnare il DataSource al sub Report:

DocumentViewer documentViewer = new DocumentViewer(); // Visualizzatore del report

Invoice invoice = new Invoice {DataSource = DocHeader}; // Report principale con il suo DataSource

SubReport subReportInvoiceDetail = (SubReport)invoice.Items[0].Items[0]; // Elemento del report principale contenente il sub report con il dettaglio
 
subReportInvoiceDetail.ReportSource.DataSource = DocumentDetails; // Oggetto con i dettagli del documento, assegnato al data source del sub report.

documentViewer.rptInvoice.Report = invoice;
documentViewer.Show();

venerdì 18 febbraio 2011

LINQ to Entities - Sono supportati solo costruttori e inizializzatori senza parametri

C# 4.0
Nella seguente query LINQ l’ordinamento si basa sul campo db di tipo “stringa” quindi un ordinamento errato perché 1.0.0.11 come stringa precede 1.0.0.9:
                    var query = from c in dc.Customer
                         join cp in dc.CustomerPackage
                             on c.Id equals cp.IdCustomer
                         join p in dc.Package
                             on cp.IdPackage equals p.Id
                         where c.Code == customerCode
                               && c.ChainCode == chainCode
                               && c.StoreCode == storeCode
                               && cp.DownloadDate == null
                         orderby p.Version
                         select p;
Così generava l’eccezione “Sono supportati solo costruttori e inizializzatori senza parametri”:
                    var query = from c in dc.Customer
                         join cp in dc.CustomerPackage
                             on c.Id equals cp.IdCustomer
                         join p in dc.Package
                             on cp.IdPackage equals p.Id
                         where c.Code == customerCode
                               && c.ChainCode == chainCode
                               && c.StoreCode == storeCode
                               && cp.DownloadDate == null
                         orderby new Version(p.Version)
                         select p;
Così generava sempre l’eccezione
                    var query = (from c in dc.Customer
                        join cp in dc.CustomerPackage
                            on c.Id equals cp.IdCustomer
                        join p in dc.Package
                            on cp.IdPackage equals p.Id
                        where c.Code == customerCode
                              && c.ChainCode == chainCode
                              && c.StoreCode == storeCode
                              && cp.DownloadDate == null
                         select p).OrderBy(p => new Version(p.Version));
Così invece funziona perché passando per il metodo ToList() credo che l’OrderBy lo faccia attraverso la collezione di oggetti e non più attraverso la query entity
                    var query =
                        (from c in dc.Customer
                         join cp in dc.CustomerPackage
                             on c.Id equals cp.IdCustomer
                         join p in dc.Package
                             on cp.IdPackage equals p.Id
                         where c.Code == customerCode
                               && c.ChainCode == chainCode
                               && c.StoreCode == storeCode
                               && cp.DownloadDate == null
                         select p).ToList().OrderBy(p => new Version(p.Version));

Per questa segnalazione va un particolare ringraziamento a Giovanni Canacci, detto anche Giò.

giovedì 27 gennaio 2011

VS 2010 - SQL Express 2005 (Errore nella visualizzazione degli script SQL)

VS 2010 ITA e SQL Express 2005 ITA su Windows 7 64 bit
Dopo aver installato VS 2010 non si riescono a visualizzare gli script SQL (.sql) dall’IDE di Visual Studio 2010; compare il seguente messaggio d’errore:
Bisogna quindi  rieseguire i seguenti setup, presenti nella cartella del dvd di installazione di VS 2010 ..\WCU\DAC:
DACFramework _ita.msi
DACProjectSystemSteup_ita.msi
TSqlLanguageService_ita.msi

lunedì 10 gennaio 2011

WPF - ListView - GridViewColumn formatting

C# 4.0
In una ListView si deve formattare la colonna contenente un importo, in modo tale che in visualizzazione questi valori siano allineati a destra e con la formattazione in valuta prevista dal sistema operativo.
Si deve quindi creare un data  template specifico in questo modo (siamo nello XAML di una view WPF)
<Window.Resources>
       
        <Style TargetType="ListViewItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
        </Style>
        <DataTemplate x:Key="amount">
            <TextBlock HorizontalAlignment="Right"
Text="{Binding Amount, StringFormat=C2}"/>
        </DataTemplate>
</Window.Resources>

Poi nella list view si deve associare alla colonna interessata il template creato poc’anzi:
<ListView Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="6" Margin="10"
ItemsSource="{Binding SelectedScaleReceipt.NoteScales}" util:GridViewSort.AutoSort="True" 
       VerticalContentAlignment="Center">
<ListView.View>
             <GridView>
             <GridViewColumn CellTemplate="{StaticResource amount}" Width="150" Header=”Importo”/>
              </GridView>
       </ListView.View>
</ListView>

martedì 23 novembre 2010

LINQ to XML - Recupero di un elemento decimal

C# 4.0
Nel leggere un valore di tipo decimal da un file XML mi si presenta un problema con i decimali in fase di casting. Ovvero il dato letto ha come separatore decimale il “.” mentre nella mia cultura è la “,” il risultato finale è quindi abbastanza evidente:
0.1   diventa 1

Questo è causato da un errato casting dell’elemento appena letto che nello specifico è:
XElement xElement = document.Root.Elements().Where(p => p.Name.LocalName.Equals("Value")).First();

decimal value = (decimal)xElement.Value;

invece si deve fare il casting dell’intero elemento XElement

decimal value = (decimal)xElement;

martedì 26 ottobre 2010

DotNet - CollectionChanged (Workaround)

C# 4.0

Una proprietà di tipo ObservableCollection<T> ( Plus) di un oggetto (Item) per notificare l’aggiunta, la cancellazione o l’aggiornamento di un elemento deve agganciare l’evento “CollectionChanged”, quindi:

_currentItem.Plus.CollectionChanged += CurrentPlusPropertyChanged;

private void CurrentPlusPropertyChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            …  
        }

Si è visto però che per quanto riguarda l’aggiornamento questo evento non scatta e ad oggi non c’è una spiegazione ufficiale su questa anomalia. Bisogna quindi adottare questo workaround: agganciare l’evento PropertyChanged di ogni singolo elemento delle collection;

foreach (Plu plu in _currentItemProduct.Plus)
                    {
                        plu.PropertyChanged += CurrentPluPropertyChanged;
                    }

private void CurrentPluPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            … 
        }

venerdì 8 ottobre 2010

IIS 6.0 - Page not found (404)

Problema
In una macchina con Windows Server 2003 e IIS 6.0 è stato installato il framework .NET 4.0. A questo punto è stato installato un servizio WCF realizzato con VS2010 (framework 4.0) ma richiamando la pagina Service.svc si aveva sempre l’errore 404 (Page not found).

Soluzione  
Aprire la console di amministrazione di IIS 6.0 e verificare che nelle “Estensioni servizio Web”, ASP.NET 4.0 sia impostato su “Consenti”.