venerdì 19 agosto 2011

Silverlight - Close a ChildWindow

C# 4.0

Per chiudere una Child Window era stato impostato il seguente codice nell’evento di chiusura della view

private void WindowChild1_Close (object sender, MouseButtonEventArgs e)
        {
            DialogResult = true;
            Close();
        }
 
Questo però comportava che dopo un paio di chiusure della suddetta child l’intera applicazione era come fosse “disabilitata”, non si riusciva più ad interagire con il browser.

Ad oggi quindi per risolvere tale anomalia è stata aggiunta la seguente riga di codice:
 
Application.Current.RootVisual.SetValue(IsEnabledProperty, true);

L’evento è stato conseguentemente modificato nel seguente modo:

private void WindowChild1_Close (object sender, MouseButtonEventArgs e)
        {
            // Workaround to correctly close a child window
            Application.Current.RootVisual.SetValue(IsEnabledProperty, true);

            DialogResult = true;
            Close();
        }

… e così funziona!

martedì 9 agosto 2011

Silverlight 4.0 & IIS 7.5

Silverlight 4.0 (C#) & IIS 7.5

Pubblicando una Silverlight Business Application su IIS e richiamando la pagina di default dell’applicazione stessa http://localhost/BusinessApplication.Web/#/Home si ottiene il seguente messaggio d’errore: "Operazione Load non riuscita per la query 'GetUser'. Errore del server remoto: NotFound."



Il suddetto errore è stato risolto disabilitando l’autenticazione Windows su IIS.









martedì 2 agosto 2011

Web Services & SSL

C# 2.0 & IIS 7.5

Si vuole richiamare da un’applicazione client un metodo di un servizio web in modalità SSL (Secure Socket Layer) ed inoltre si vogliono nascondere i parametri del suddetto web method.
Si dà per assunto l’installazione del certificato nel server.

1.       Richiamare un metodo web in modalità SSL da un’applicazione client :

// Viene istanziato l’oggetto che si riferisce al web service
            DocumentHistory d = new DocumentHistory();
 
NetworkCredential networkCredential = new NetworkCredential("ciccio", "pasticcio");
       d.Credentials = networkCredential;

       ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

       // Viene invocato il metodo richiesto
            object[] r = d.DepartmentReport("??", "??”, “!!”);

Da tenere presente quindi che se viene omessa la riga di codice evidenziata in giallo si verifica la seguente web exception:
 
“Connessione sottostante chiusa: Impossibile stabilire una relazione di trust per il canale sicuro SSL/TLS..”


2.  Per nascondere i parametri del metodo web si deve aggiungere il seguente elemento nel web.config del servizio web, all’interno dell’elemento <system.web>:

<system.web>
               <webServices>
              <protocols>
                <remove name="HttpPostLocalhost"/>
              </protocols>
            </webServices>
            </system.web>

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>