Attivare le estensioni ASP.NET su IIS 6.0

Scritto da Massimo Bonanni il 20 febbraio 2012
Livello: 100 

Installando un servizio WCF 4.0 su IIS 6.0, può succedere che questo non vada anche se il Framework 4.0 è correttamente installato e "agganciato" a IIS tramite aspnet_regiis.exe /i.
In questo caso può tornare utile lo script IIsExt.vbs presente in C:\Windows\System32 che ci permette di vedere se una estensione ISAPI è bloccata o meno dal nostro IIS 6.0.

In particolare se lanciamo lo script con i seguenti argomenti:

 
cscript c:\WINDOWS\system32\iisext.vbs /ListFile
 

otteniamo un report del genere:

Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.
 
Connecting to server ...Done.
 
Status / Extension Path
------------------------
0  C:\WINDOWS\system32\inetsrv\httpodbc.dll
0  C:\WINDOWS\system32\inetsrv\ssinc.dll
0  C:\WINDOWS\system32\inetsrv\asp.dll
1  C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll
0  *.exe
0  C:\WINDOWS\system32\inetsrv\httpext.dll
0  *.dll
1  C:\WINDOWS\Microsoft.NET\Framework64\v2.0.50727\aspnet_isapi.dll
1  C:\WINDOWS\system32\MQISE.DLL
0  C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll

 

Osserviamo che la aspnet_isapi.dll del framework 4.0 (l'ultima della lista) è disabilitata (flag 0).
Per abilitarla è sufficiente scrivere:

 
cscript c:\WINDOWS\system32\iisext.vbs /EnFile C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll
 

 

Per maggiori info sullo script iisext.vbs consultare il link http://support.microsoft.com/kb/328419/

Localizzazione e lingue accessorie in WP7

Scritto da Massimo Bonanni il 17 febbraio 2012
Framework: 4.0   • Livello: 100 

Se stiamo realizzando applicazioni localizzate dobbiamo porre attenzione all'indicare quali lingue sono supportate (oltre a quella neutral che si può impostare all'interno delle impostazioni dell'assembly).
Per fare ciò è necessario modificare il file di progetto (vbproj per VB.NET e csproj per C#), inserendo le lingue accessorie nel tag SupportedCultures, come nell'esempio:

 
<SupportedCultures>es-ES;fr-FR;de-DE;en-US</SupportedCultures>
 

 

 In questo caso, oltre che la lingua neutral impostata nelle proprietà dell'assembly, sono supportate lo spagnolo, il francese, l'inglese (Stati Uniti) e il tedesco.

Testare applicazioni WP7 che usano foto e musica

Scritto da Nicolò Carandini il 13 febbraio 2012
Framework: 4.0   • Livello: 100 

Nello sviluppo di applicazioni Windows Phone che accedono alla musica o alle foto, può capitare di fare il debug dell'applicazione sul device e ricevere un messaggio che chiede di sconnetersi da Zune prima di poter accedere alla musica o alle foto. Per risolvere il problema occorre seguire i seguenti passi, dando per scontato che il telefono sia già stato sbloccato:

  1. Collegare il telefono
  2. Attendere l'apertura di Zune (se non era già aperto) e poi chiuderlo
  3. Avviare WPConnect ("C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v7.1\Tools\WPConnect\x64\WPConnect.exe")
  4. Avviare il programma da debuggare.

Nota: Al passo 3, se si ha una macchina a 32 bit il path da usare è "C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v7.1\Tools\WPConnect\x86\WPConnect.exe"

Aprire la pagina del marketplace dell'applicazione WP7

Scritto da Massimo Bonanni il 10 febbraio 2012
Linguaggio: VB   • Framework: 4.0   • Livello: 100 

Il seguente codice consente di aprire la pagina del marketplace relativa ai dettagli dell'applicazione in esecuzione:

Dim marketplaceDetailTask = New MarketplaceDetailTask()
marketplaceDetailTask.ContentType = MarketplaceContentType.Applications
marketplaceDetailTask.Show()

 

 Se impostiamo, invece, la proprietà ContentIdentifier del MarketplaceDetailTask con un Id valido, viene aperta la pagina di una applicazione specifica:

Dim marketplaceDetailTask = new MarketplaceDetailTask()
marketplaceDetailTask.ContentIdentifier = "c14e93aa-27d7-df11-a844-00237de2db9e"
marketplaceDetailTask.ContentType = MarketplaceContentType.Applications
marketplaceDetailTask.Show()

 

Forzare il binding di un TextBox su WP7

Scritto da Nicolò Carandini il 06 febbraio 2012
Linguaggio: C#   • Framework: 4.0   • Livello: 100 

Generalmente il binding two-way di una textbox aggiorna la proprietà a cui è bindata quando il controllo perde il focus. Poiché però i pulsanti posizionati nel menu non spostano il focus della pagina, un eventuale pulsante di conferma ivi posizionato fa si che ciò che l'utente ha inserito nella textbox non venga trascritto nella sorgente. Per forzare il binding si può eseguire il seguente codice, da inserire nel codice associato all'evento prodotto dal pulsante:

//Force two-way binding of the editing field
object focusObj = FocusManager.GetFocusedElement();
if (focusObj != null && focusObj is TextBox)
{
    var binding = (focusObj as TextBox).GetBindingExpression(TextBox.TextProperty);
    binding.UpdateSource();
}

 

Se poi oltre alle textbox abbiamo anche una o più PasswordBox, allora occorre estendere il codice in questo modo:

// Force two-way binding of the editing field
object focusObj = FocusManager.GetFocusedElement();
if (focusObj != null && (focusObj is TextBox || focusObj is PasswordBox))
{
    BindingExpression binding;
    if (focusObj is TextBox)
    {
        binding = (focusObj as TextBox).GetBindingExpression(TextBox.TextProperty);
    }
    else
    {
        binding = (focusObj as PasswordBox).GetBindingExpression(PasswordBox.PasswordProperty);
    }
    binding.UpdateSource();
}

 

Recuperare la versione di un assembly in WP7

Scritto da Massimo Bonanni il 03 febbraio 2012
Linguaggio: VB   • Framework: 4.0   • Livello: 100 

Uno dei possibili modi per recuperare la versione di un assembly è "parsare" il full name dello stesso.
La seguente funzione mostra come fare:

Public Function GetAssemblyVersion(asm As Assembly) As String
    If asm.FullName IsNot Nothing Then
        Dim parts = asm.FullName.Split(","c)
        Dim version = parts(1).ToLower().Replace("version=", "")
        Return version
    End If
    Return Nothing
End Function

 

 Un utilizzo può essere quello di recuperare la versione dell'applicazione:

Dim ver = GetAssemblyVersion(Assembly.GetExecutingAssembly())

 

 

Inserimento della password in WP7

Scritto da Nicolò Carandini il 30 gennaio 2012
Framework: 4.0   • Livello: 100 

Per gestire l'inserimento di una password, in Windows Phone 7 non bisogna utilizzare il TextBox, che infatti non ha alcuna proprietà per visualizzare i classici pallini al posto dei caratteri digitati, ma il PasswordBox.
Il controllo PasswordBox mostra il carattere digitato per un paio di secondi per poi rimpiazzarlo col classico pallino.

Scrivere con la tastiera nell'emulatore Windows Phone 7

Scritto da Luca Cestola il 27 gennaio 2012
Framework: 4.0   • Livello: 100 

Nell'emulatore di Windows Phone 7, in alternativa alla tastiera su schermo, è possibile utilizzare la tastiera del computer. Basta premere il tasto PgSu quando è visibile la tastiera sull'emulatore.

Abilitare il data annotation attribute "Required" sui checkbox con la validazione unobtrusive in MVC3

Scritto da Alessandro Mostarda il 23 gennaio 2012
Linguaggio: C#,VB   • Framework: 4.0   • Livello: 200 

Di default, se nel nostro model abbiamo una proprietà con l'attributo required, l'unobtrusive validation di MVC3 non utilizza l'attributo stesso nel caso in cui utilizziamo la checkbox come tag html di rendering. Utilizzando questo script è possibile abilitare l'attributo required sul tag CheckBox.

$(function   () {
    $.extend($.validator.unobtrusive, {
        overrideAdapter: function (name, func) {
            for (var i = 0; i < this.adapters.length; i++) {
                if (this.adapters[i].name == name) {
                    this.adapters[i].adapt = func;
                    break;
                }
            }
        }
    });
});
   
$(function   () {
    $.validator.unobtrusive.overrideAdapter("required", function (options) {
        options.rules["required"] = true;
        if (options.message) {
            options.messages["required"] = options.message;
        }
    });
});

Utilizzare i Code Contracts su WP7

Scritto da Massimo Bonanni il 20 gennaio 2012
Framework: 4.0   • Livello: 100 

Il CLR per Windows Phone 7 non prevede la presenza della classe Contract e, quindi, se vogliamo utilizzare i Code Contract sul nostro WP/ dobbiamo referenziare la dll Microsoft.Contracts.dll che si trova nella cartella:

 
%PROGRAMFILES%/Microsoft/Contracts/PublicAssemblies/Silverlight3
 

 

 

Come rilevare il tema usato in WP7

Scritto da Luca Cestola il 16 gennaio 2012
Linguaggio: C#   • Framework: 4.0   • Livello: 100 

Per verificare se il tema correntemente impostato è il tema Light basta effettuare una verifica sulla risorsa "PhoneLightThemeVisibility".

 
bool isLightTheme = ((Visibility)Application.Current.Resources["PhoneLightThemeVisibility"] == Visibility.Visible);
 

 

Deserializzazione con DataContractJsonSerializer e costruttori

Scritto da Massimo Bonanni il 13 gennaio 2012
Linguaggio: VB   • Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

Quando si usa la classe DataContractJsonSerializer per deserializzare dal formato JSON, è necessario ricordarsi che il metodo ReadObject() della stessa classe (utilizzato nell'operazione di deserializzazione) ha la brutta abitudine di non richiamare il costruttore della classe che stiamo utilizzando per contenere i dati.
Per questo motivo, se abbiamo una classe con una proprietà che deve essere valorizzata alla creazione dell'istanza e che non è presente nello stream JSON, non possiamo contare sulla valorizzazione di tale proprietà nel costruttore.
Ad esempio la classe:

<DataContract()>
Public Class Persona
 
    <DataMember(Name:="nome")>
    Public Property Nome As String
    <DataMember(Name:="cognome")>
    Public Property Cognome As String
 
    Private _DataCreazione As DateTime = DateTime.Now
    Public ReadOnly Property DataCreazione As DateTime
        Get
            Return Me._DataCreazione
        End Get
    End Property
 
End Class

 

se deserializzata con il DataContractJsonSerializer, non avrà la proprietà DataCreazione impostata correttamente.
Per ovviare a questo possiamo utilizzare uno dei due attributi OnDeserializedAttribute o OnDeserializingAttribute.
Entrambi consentono di decorare dei metodi che vengono, rispettivamente, richiamati subito dopo e immediatamente prima della deserializzazione.
La classe precedente può essere modificata come segue:

<DataContract()>
Public Class Persona
 
    <DataMember(Name:="nome")>
    Public Property Nome As String
    <DataMember(Name:="cognome")>
    Public Property Cognome As String
 
    Private _DataCreazione As DateTime = DateTime.Now
    Public ReadOnly Property DataCreazione As DateTime
        Get
            Return Me._DataCreazione
        End Get
    End Property
 
    <OnDeserializing()>
    Public Sub OnDeserializing(context As StreamingContext)
        Me._DataCreazione = DateTime.Now
    End Sub
End Class

 

 

Permettere il copia/incolla di XML all'interno di un progetto C#

Scritto da Simone Di Stasio il 09 gennaio 2012
Linguaggio: C#   • Framework: 4.0   • Livello: 100 

Se si lavora in VB.NET non si sente la problematica dovuta al copia/incolla di un documento XML, in quanto, grazie agli Xml Literals, la funzionalità è nativamente supportata dal linguaggio.
In c# invece se si copia un xml e lo si incolla in Visual Studio 2010 il risultato non è quello che ci si aspetta, ecco quindi una pillola che risolve il problema.

  • Estrarre il contenuto del file zip C:\Program Files (x86)\Microsoft Visual Studio XX.XX\Samples\1033\CSharpSamples.zip
  • Aprire la solution LinqSamples\PasteXmlAsLinq e compilare.
  • Aggiungere il risultato della compilazione PasteXmlAsLinq.AddIn,PasteXmlAsLinq.dll alla cartella AddIn di Visual Studio, generalmente è questa C:\Users\All vUsers\Microsoft Visual Studio\Addins. Se la cartella Addins non esiste createla.
  • Riavviare Visual Studio.

Ora si potrà incollare direttamente un xml in visual studio che creerà automaticamente la struttura XElement

Partiamo dal seguente Xml:

<?xml version="1.0" encoding="UTF-8"?>
<response>
  <nodes id="nodes">
    <node id="node 1"/>
    <node id="node 2"/>
    <node id="node 3"/>
  </nodes>
</response>

 

otterremo:

XElement xml = new XElement("response",
           new XElement("nodes",
       new XAttribute("id", "nodes"),
         new XElement("node",
        new XAttribute("id", "node 1")),
            new XElement("node",
        new XAttribute("id", "node 2")),
          new XElement("node",
    new XAttribute("id", "node 3"))));

 

Uguaglianza tra tipi in VB.NET

Scritto da Massimo Bonanni il 23 dicembre 2011
Linguaggio: VB   • Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

Se abbiamo due istanze della classe Type e vogliamo verificare che tali istanze rappresentino effettivamente lo stesso tipo, possiamo procedere in due modi: siano Type1 e Type2 le due istanze da controllare

If Type1 Is Type2 Then
      ' i tipi sono uguali
End If

 

oppure

If Type.Equals(Type1, Type2) Then
      ' i tipi sono uguali
End If

 

Nel secondo caso, in realtà stiamo utilizzando il metodo shared Equals di Object, la cui definizione è:

<TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")> _
Public Shared Function Equals(ByVal objA As Object, ByVal objB As Object) As Boolean
    Return ((objA Is objB) OrElse (((Not objA Is Nothing) AndAlso (Not objB Is Nothing)) AndAlso objA.Equals(objB)))
End Function

 

Configurazione degli Unity built-in life time manager

Scritto da Simone Di Stasio il 19 dicembre 2011
Linguaggio: C#   • Framework: 4.0   • Livello: 200 

Configurazione attraverso file di configurazione (app.config/web.config) :

<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
   <typeAliases>
       <!-- Lifetime manager types -->
       <typeAlias alias="Transient" type="Microsoft.Practices.Unity.TransientLifetimeManager,Microsoft.Practices.Unity"/>
       <typeAlias alias="Singleton" type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager,Microsoft.Practices.Unity"/>
       <typeAlias alias="PerResolve" type="Microsoft.Practices.Unity.PerResolveLifetimeManager,Microsoft.Practices.Unity"/>
       <typeAlias alias="PerThread" type="Microsoft.Practices.Unity.PerThreadLifetimeManager,Microsoft.Practices.Unity"/>
       <typeAlias alias="Hierarchical" type="Microsoft.Practices.Unity.HierarchicalLifetimeManager,Microsoft.Practices.Unity"/>   
       <typeAlias alias="External"  type="Microsoft.Practices.Unity.ExternallyControlledLifetimeManager,Microsoft.Practices.Unity"/>
       <!-- User-defined type aliases -->
       <typeAlias alias="IMyService" type="Namespace.Type, Namespace" />
   </typeAliases>
   <container>
      <register type="IMyService" mapTo="Namespace.Type, Namespace">
         <lifetime type="Singleton" />
      </register>
   </container>   
</unity>

 

Configurazione attraverso fluent interface

C#

container.RegisterType<IMyService, Service>(new ContainerControlledLifetimeManager());
container.RegisterType<IMyService, Service>(new PerResolveLifetimeManager());
container.RegisterType<IMyService, Service>(new PerThreadLifetimeManager());
container.RegisterType<IMyService, Service>(new HierarchicalLifetimeManager());
container.RegisterType<IMyService, Service>(new ExternallyControlledLifetimeManager());

 

 

Bloccare il PC da codice

Scritto da Massimo Bonanni il 16 dicembre 2011
Linguaggio: VB   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

Per poter bloccare il pc (lock) si può utilizzare l'API LockWorkStation della libreria user32.dll.
La definizione è la seguente:

VB.NET

 
Private Declare Function LockWorkStation Lib "user32.dll" () As Long
 

 

Ed il suo utilizzo:

VB.NET

Sub Main()
    LockWorkStation()
End Sub

 

Abilitare la console dell'emulatore di Windows Phone 7

Scritto da Luca Cestola il 12 dicembre 2011
Framework: 4.0   • Livello: 100 

In fase di sviluppo, può tornare utile poter utilizzare istruzioni come Console.WtriteLine in un'applicazione che giri nell'emulatore di WP7. Di default la console dell'emulatore non è visibile, ma è possibile attivarla tramite una chiave di registro:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\XDE]
"EnableConsole"=dword:00000001

 

Si può inserire manualmente la chiave nel registro o copiare il testo precedente in un file con estensione "reg" per poi eseguirlo. Sui sistemi a 64 bit, poiché la console di WP7 è a 32 bit, è necessario inserire la chiave di registro nella parte a 32 bit, utilizzando il programma regedit.exe che si trova normalmente nella cartella c:\Windows\SysWow64 oppure utilizzando quest'altro contenuto per il file con estensione "reg":

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\XDE]
"EnableConsole"=dword:00000001

Visualizzare nella finestra Output di Debug il comando SQL emesso da LinqToSQL

Scritto da Nicolò Carandini il 09 dicembre 2011
Linguaggio: C#   • Framework: 3.5,4.0   • Livello: 100 

Il DataContext ha una proprietà Log di tipo StreamWriter.
Per mostrare l'SQL nella console basta impostare la proprietà Log del DataContext così:

C#

 
myDataContext.Log = Console.Out;
 

 

Se invece vogliamo utilizzare la finestra output del debugger, possiamo creare la seguente classe:

C#

using System.IO;
using System.Diagnostics;
using System.Text;
 
class DebugTextWriter : TextWriter
{
    public override void Write(char[] buffer, int index, int count)
    {
        Debug.WriteLine(new String(buffer, index, count));
    }
 
    public override void Write(string value)
    {
        Debug.WriteLine(value);
    }
 
    public override Encoding Encoding
    {
        get { return Encoding.UTF8; }
    }
}

 

ed utilizzarla così:

C#

 
myDataContext.Log = new DebugTextWriter();
 

Come scrivere i messaggi di debug nella console Javascript di Firefox, Internet Explorer e Google Chrome

Scritto da Fadi Scavo il 05 dicembre 2011
Linguaggio: C#,JS   • Livello: 100 

Per poter scrivere, in Silverlight, un messaggio nella finestra Output di Visual Studio è sufficiente richiamare il metodo:

C#

 
System.Diagnostics.Debug.WriteLine(message);
 

 

Se, invece, vogliamo scrivere lo stesso messaggio nella console del browser, dobbiamo utilizzare i seguenti script:

Firefox e Internet Explorer

var console = HtmlPage.Window.Eval("console.log") as ScriptObject;
if (console != null)
{
    console.InvokeSelf(message);
}

 

Google Chrome

var console = HtmlPage.Window.GetProperty("console") as ScriptObject;
if (console != null)
{
    console.Invoke("log", message);
}

 

 

Recuperare un controllo in base al nome in maniera ricorsiva in Windows Forms

Scritto da Massimo Bonanni il 02 dicembre 2011
Linguaggio: VB   • Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

A volte si può avere la necessità di recuperare un controllo presente nella nostra GUI in base al nome.
La seguente funzione generic permette di eseguire questa operazione iterando, in meniera recursiva, tra i controlli di un generico container (di tipo Control):

VB.NET

Public Function GetControlRecursive(Of T As Control)(controlName As String, container As Control) As T
    If TypeOf container Is T AndAlso container.Name = controlName Then
        Return CType(container, T)
    End If
    For Each ctrl In container.Controls.OfType(Of Control)()
        Dim retCtrl = GetControlRecursive(Of T)(controlName, ctrl)
        If retCtrl IsNot Nothing Then
            Return retCtrl
        End If
    Next
    Return Nothing
End Function

 

 

Controllare l’auto start di un Host in WCF

Scritto da Antonio Pierascenzi il 28 novembre 2011
Linguaggio: C#   • Framework: 3.5,4.0   • Livello: 100 

In fase di creazione di un progetto di tipo WCF Service Library, dobbiamo stare attento al fatto che di default viene impostato un flag nelle proprietà del progetto stesso che determina, in fase di debug , l'attivazione automatica e l'esecuzione dell'Host Service.

debug

Questa opzione causa l'apparizione di un fastidioso messaggio in fase di startup da parte ad esempio di un client di tipo Console presente nella stessa solution.

service

Disabilitare il TaskManager di Windows

Scritto da Massimo Bonanni il 25 novembre 2011
Livello: 100 

Per disabilitare il TaskManager è sufficiente modificare (o creqare se non esiste) la seguente chiave di registro:

HKCU\
Software\
  Microsoft\
   Windows\
    CurrentVersion\
     Policies\
      System\DisableTaskMgr = dword:1


Il valore 1 disabilita il TaskManager, mentre il valore 0 (o la mancanza della chiave) lo abilita.

ObservableCollection thread safe in Silverlight

Scritto da Fadi Scavo il 21 novembre 2011
Linguaggio: C#   • Framework: 3.5,4.0   • Livello: 200 

A volte può capitare di dover aggiungere un elemento ad una ObservableCollection da un thread che non sia quello proprietario dell'interfaccia. In questo caso, se non adottiamo l'utilizzo del dispatcher, otteniamo una bella eccezione "Invalid cross-thread access".
La classe proposta in questa pillola risolve il problema incapsulando l'utilizzo del dispatcher:

C#

public class DispatcherObservableCollection<T> : ObservableCollection<T>
{
    private Dispatcher _dispatcher;
    public DispatcherObservableCollection(Dispatcher dispatcher)
    {
        _dispatcher = dispatcher;
    }
   
    protected override void SetItem(int index, T item)
    {
        InvokeMethod(() => base.SetItem(index, item));
    }
   
    protected override void InsertItem(int index, T item)
    {
        InvokeMethod(() => base.InsertItem(index, item));
    }
   
    protected override void OnCollectionChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        InvokeMethod(() => base.OnCollectionChanged(e));
    }
   
    protected override void OnPropertyChanged(System.ComponentModel.PropertyChangedEventArgs e)
    {
        InvokeMethod(() => base.OnPropertyChanged(e));
    }
   
    private void InvokeMethod(Action action)
    {
        if (_dispatcher.CheckAccess())
        {
            action();
        }
        else
        {
            _dispatcher.BeginInvoke(action);
        }
    }
}

 

 Ad esempio:

C#

 
DispatcherObservableCollection<string>  Data = new DispatcherObservableCollection<string>(Deployment.Current.Dispatcher);
 

 

 

Nascondere o visualizzare lo StartButton di Windows7 con PInvoke

Scritto da Massimo Bonanni il 18 novembre 2011
Linguaggio: VB   • Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

In una precedente pillola abbiamo visto come sia possibile nascondere la TaskBar di Windows utilizzando PInvoke.
Tale operazione non nasconde, però lo StartButton.
Per nascondere questo è necessario utilizzare le API FindWindow e ShowWindow per agire, oltre che sulla TaskBar anche sullo StartButton.

VB.NET

<DllImport("user32.dll")>
Private Shared Function FindWindow(className As String, windowText As String) As IntPtr
End Function
 
<DllImport("user32.dll")>
Private Shared Function ShowWindow(hwnd As IntPtr, command As Integer) As Integer
End Function
 
Private Const SW_HIDE As Integer = 0
Private Const SW_SHOW As Integer = 1

 

 I metodi per nascondere e visualizzare la taskbar sono i seguenti:

VB.NET

Public Shared Function HideStartButton() As Boolean
    Dim retval = False
    Dim hwndTaskBar = FindWindow("Shell_TrayWnd", "")
    If hwndTaskBar <> IntPtr.Zero Then
        ShowWindow(hwndTaskBar, SW_HIDE)
            Dim hwndStartButton = FindWindow("Button", "Start")
            If hwndStartButton <> IntPtr.Zero Then
            retval = ShowWindow(hwndStartButton, SW_HIDE)
            End If
        End If
    Return retval
End Function
 
Public Shared Function ShowStartButton() As Boolean
    Dim retval = False
    Dim hwndTaskBar = FindWindow("Shell_TrayWnd", "")
    If hwndTaskBar <> IntPtr.Zero Then
        ShowWindow(hwndTaskBar, SW_SHOW)
        Dim hwndStartButton = FindWindow("Button", "Start")
        If hwndStartButton <> IntPtr.Zero Then
            retval = ShowWindow(hwndStartButton, SW_SHOW)
        End If
    End If
    Return retval
End Function

 

 

Utilizzare gli Extension Methods nel framework 2.0

Scritto da Simone Di Stasio il 14 novembre 2011
Linguaggio: C#,VB   • Framework: 2.0   • Livello: 200 

Per poter abilitare l'utilizzo degli extension methods con il framework 2.0, è sufficiente dichiarare la seguente classe:

C#

namespace System.Runtime.CompilerServices
{
    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly)]
    public sealed class ExtensionAttribute : Attribute
    {
    }
}

 

VB.NET

Namespace System.Runtime.CompilerServices
 
    <AttributeUsage(AttributeTargets.Method Or AttributeTargets.Class Or AttributeTargets.Assembly)> _
    Public Class ExtensionAttribute
        Inherits Attribute
    End Class
 
End Namespace

 

 In questo modo possiamo creare gli extension methods come se ci si trovasse nel framework 3.5.
Ad esempio:

C#

public static class StringExtension
{       
    public static bool LengthIsGreathenThan(this string source, int requiredLength)
    {
      return source.Length > requiredLength;
    }
}

 

VB.NET

Public Module StringExtension
 
    <Extension()> _
    Public Function LengthIsGreathenThan(ByVal source As String, ByVal requiredLength As Integer) As Boolean
        Return source.Length > requiredLength
    End Function
 
End Module


Questo può avvenire perchè il CLR del Framework 3.5 è lo stesso del Framework 2.0 e gli Extensions Methods sono solo syntactic sugar (ovviamente non sono presenti gli extension methods introdotti specificatamente nella versione 3.5 come quelli a supporto di LINQ).
Per gli utilizzatori di Visual Basic attenzione al namespace di default che Visual Studio mette negli assembly. L'attributo ExtensionAttribute deve trovarsi esattamente nel namespace di sistema System.Runtime.CompilerServices.

Nascondere o visualizzare la TaskBar di Windows7 con PInvoke

Scritto da Massimo Bonanni il 11 novembre 2011
Linguaggio: VB   • Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

A volte si ha la necessità di dover nascondere la TaskBar di Windows e per fare questo possiamo ricorrere alla tecnica di PInvoke.
E' sufficiente richiamare opportunamente le API FindWindow e ShowWindow:

VB.NET

<DllImport("user32.dll")>
Private Shared Function FindWindow(className As String, windowText As String) As IntPtr
End Function
 
<DllImport("user32.dll")>
Private Shared Function ShowWindow(hwnd As IntPtr, command As Integer) As Integer
End Function
 
Private Const SW_HIDE As Integer = 0
Private Const SW_SHOW As Integer = 1

 

 In particolare, i metodi per nascondere e visualizzare la TaskBar sono:

VB.NET

Public Function HideTaskBar() As Boolean
     Dim retval = False
     Dim hwndTaskBar = FindWindow("Shell_TrayWnd", "")
     If hwndTaskBar <> IntPtr.Zero Then
         retval = ShowWindow(hwndTaskBar, SW_HIDE)
     End If
     Return retval
End Sub
 
Public Function ShowTaskBar() As Boolean
     Dim retval = False
     Dim hwndTaskBar = FindWindow("Shell_TrayWnd", "")
     If hwndTaskBar <> IntPtr.Zero Then
         retval= ShowWindow(hwndTaskBar, SW_SHOW)
     End If
     Return retval
End Sub

 

 

Adattare la larghezza degli elementi di una ListBox alla larghezza del contenitore in WPF/Silverlight

Scritto da Fadi Scavo il 07 novembre 2011
Linguaggio: C#,VB   • Framework: 3.5,4.0   • Livello: 100 

Per poter ottenere che gli elementi contenuti in una ListBox occupino interamente lo spazio offerto loro dal contenitore, è sufficiente impostare la proprietà HorizontalContentAlignment al valore Stretch.
Un esempio di stile personalizzato in cui tale valore è utilizzato è il seguente:

<Style x:Key="ListBoxItemStyle1" TargetType="ListBoxItem">
       <Setter Property="Background" Value="Transparent"/>
       <Setter Property="BorderThickness" Value="0"/>
       <Setter Property="BorderBrush" Value="Transparent"/>
       <Setter Property="Padding" Value="0"/>
       <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
       <Setter Property="VerticalContentAlignment" Value="Top"/>
       <Setter Property="Template">
              <Setter.Value>
                    <ControlTemplate TargetType="ListBoxItem">
                           ....
                    </ControlTemplate>
             </Setter.Value>
       </Setter>
</Style>

 

Ricavare l'elenco delle form "possedute" da una form.

Scritto da Massimo Bonanni il 04 novembre 2011
Linguaggio: VB   • Framework: 3.5,4.0   • Livello: 100 

Se abbiamo una gerarchia di Form all'interno della nostra applicazione Window Forms, possiamo, in qualsiasi istante, ricavare le form "possedute" da una form utilizzando la funzione:

VB.NET

Public Function GetOwnedForms(owner As Form) As IEnumerable(Of Form)
    Return From f In Application.OpenForms.OfType(Of Form)()
                  Where f.Owner IsNot Nothing AndAlso f.Owner Is owner
                  Select f
End Function

 

 Le form figlie debbono essere aperte avendo impostato la proprietà Owner.

Estrarre da un assembly i tipi derivati non astratti

Scritto da Antonio Pierascenzi il 31 ottobre 2011
Linguaggio: C#   • Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

Dall'assembly corrente possiamo estrarre, via reflection, diverse classi che rispondono alle nostre necessità, ad esempio, per avere l'elenco di tutte le classi che derivano da una classe base escludendo quelle astratte, possiamo scrivere qualcosa del genere:

types = Assembly.GetExecutingAssembly().GetTypes();
var myTypes = types.Where(type => type.IsSubclassOf(typeof(ClasseBase))
&& (!type.IsAbstract)).ToList();
 

 


Nel codice precedente diamo per scontato il fatto che i tipi da ricercare siano nell'assembly corrente, se non è così dobbiamo caricare l'assembly desiderato attraverso, ad esempio la chiamata al metodo starico Load della classe Assembly:

Assembly myAssembly = Assembly.Load(fullName);

Utilizzare il code-behind di una Window come DataContext in WPF

Scritto da Massimo Bonanni il 28 ottobre 2011
Framework: 3.5,4.0   • Livello: 100 

Se vogliamo utilizzare il code-behind di una Window come data context per la nostra finestra possiamo utilizzare il seguente binding:

 
DataContext="{Binding RelativeSource={RelativeSource Self}}"
 

 

nella definizione XAML della finestra.

<Window x:Class="MainWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  DataContext="{Binding RelativeSource={RelativeSource Self}}">
   .
   .
   .
</Window>

 

Eseguire una query LINQ su un array restituendo il valore e l'indice

Scritto da Massimo Bonanni il 24 ottobre 2011
Linguaggio: VB   • Framework: 3.5,4.0   • Livello: 100 

Supponiamo di avere un array e di voler eseguire una query LINQ restituendo, contemporaneamente, il valore che verifica una determinata condizione e l'indice corrispondente a tale valore.
Ad esempio, sia Integers l'array di interi definito nel seguente modo:

VB.NET

 
Dim integers = {1, 2, 5, 4, 8, 9, 10, 13, 45, 67, 89, 32, 74}
 


e supponiamo di voler recuperare i numeri pari con il relativo indice:

VB.NET

Dim evens = integers.Select(Function(v, i) New With {.Value = v, .Index = i}) _
                .Where(Function(a) a.Value Mod 2 = 0)


L'extension method Select recupera una collezione di anonymous type formati dal valore contenuto nell'array (proprietà Value) e dal suo indice (proprietà Index) su cui possiamo eseguire nuovamente delle operazioni.

Abilitare la visibilità delle classi Internals in altri assembly.

Scritto da Massimo Bonanni il 21 ottobre 2011
Linguaggio: VB   • Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

Se definiamo, ad esempio, una classe di tipo Friend in un nostro assembly ed abbiamo la necessità di poterla utilizzare in un altro assembly (ad esempio per eseguire i test), possiamo far in modo che per lo specifico assembly la classe sia visibile come fosse Public.
Il tutto è ottenuto utilizzando l'attributo InternalsVisibleTo() nell'assembly della classe Friend:

VB.NET

<Assembly: System.Runtime.CompilerServices.InternalsVisibleTo(NomeAssembly)>

 

dove NomeAssembly è il nome dell'assembly in cui vogliamo rendere visibile la classe.

Come ricavare un record con Entity Framework 4.1

Scritto da Alessandro Mostarda il 17 ottobre 2011
Linguaggio: C#,VB   • Framework: 4.0   • Livello: 100 

Per ricavare l'istanza di un oggetto, relativo al record di una tabella, tramite la chiave si può usare il nuovo metodo FIND dell'oggetto DBSet

C#

var key = 2;
using (var ctx = new CtxEntities())
{
    var fattura = ctx.Fatture.Find(key);
}

 
VB.NET

Dim key As Integer = 2
Using ctx As New CtxEntities
    Dim fattura = ctx.fatture.Find(key)
End Using

Referenziare file esterni in web.config o app.config

Scritto da Massimo Bonanni il 14 ottobre 2011
Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

E' possibile referenziare, all'interno del file di configurazione dell'applicazione (Web.config o app.config), dei file esterni che contengono i dati effettivi di configurazione.
Ad esempio, all'interno del web.config, è possibile scrivere:

<?xml version="1.0"?>
 
<!--
For more information on how to configure your ASP.NET application, please visit
http://go.microsoft.com/fwlink/?LinkId=169433
-->
 
<configuration>
 
<appSettings configSource="appSettings.config">
</appSettings>
 
.
.
.
 
</configuration>

 
e nel file appSettings.config (contenuto nella stessa directory del web.config):

<?xml version="1.0"?>
<appSettings>
<add key="Prova" value="valore"/>
</appSettings>

 

Il vantaggio è che, in caso di sito web in cui la modifica del web.config provoca un reset di IIS, la modifica di un file referenziato non provoca alcun reset. 

Sapere se un View Model sta "girando" in Design Mode

Scritto da Massimo Bonanni il 10 ottobre 2011
Linguaggio: C#,VB   • Framework: 3.5,4.0   • Livello: 100 

Quando utilizziamo il pattern MVVM, il nostro View Model non ha alcuna conoscenza diretta della UI e, quindi, non possiamo utilizzare la pillola .
Per sapere, all'interno di un View Model (o di qualsiasi altra classe che non ha un Dependency Object a disposizione) se ci si trova in design mode o no, si può utilizzare il seguente codice:

VB.NET

If Not DesignerProperties.GetIsInDesignMode(New DependencyObject()) Then
    ' non siamo in design mode
Else
    ' siamo in design mode
End If

 

C#

if (!DesignerProperties.GetIsInDesignMode(new DependencyObject())) {
    // non siamo in design mode
} else {
    // siamo in design mode
}

 

Ricavare se ci si trova in DesignMode in Silverlight

Scritto da Massimo Bonanni il 07 ottobre 2011
Linguaggio: C#,VB   • Framework: 3.5,4.0   • Livello: 100 

Per conoscere se siamo in design mode o in running mode all'interno di un nostro applicativo Silverlight possiamo utilizzare la proprietà IsInDesignTool della classe DesignerProperties.

VB.NET

If DesignerProperties.IsInDesignTool Then
    ' designer mode
Else
    ' run mode
End If

 

C#

if (DesignerProperties.IsInDesignTool)
{
     // Designer Mode
}
else
{
    // Running Mode
}


Il precedente codice è utilizzabile anche all'interno di codice che non abbia nulla a che fare con l'interfaccia grafica (ad esempio all'interno di un ViewModel MVVM).

Definire un datacontext a design time in WPF

Scritto da Massimo Bonanni il 03 ottobre 2011
Framework: 3.5,4.0   • Livello: 100 

In fase di design di un interfaccia WPF potrebbe essere utile definire un datacontex da utilizzare esclusivamente per il design stesso che, in fase di esecuzione, venga sostituito dall'effettivo datacontext della nostra applicazione.
Per fare questo è sufficiente utilizzare le proprietà dei controli che sono contenute nel namespace http://schemas.microsoft.com/expression/blend/2008 ed in particolare la DataContext:

<Window x:Class="Form1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:my="mio namespace"
             mc:Ignorable="d"
             d:DesignHeight="150" d:DesignWidth="300" d:DataContext="{d:DesignInstance my:ClasseDataContext}">
    <Grid>
    </Grid>
</Window>

 

Nel caso precedente abbiamo definito in datacontext di design (d:DataContext) impostando un'istanza della nostra classe ClasseDataContext contenuta nel nostro namespace (d:DesignInstance my:ClasseDataContext)
In questo modo, in fase di design, abbiamo visibilità delle proprietà esposte dal datacontext e possiamo utilizzare l'interfaccia di Visual Studio per impostare il binding sui controlli dell'interfaccia.

Sapere se un controllo WPF è in DesignMode o no

Scritto da Massimo Bonanni il 30 settembre 2011
Linguaggio: C#,VB   • Framework: 3.5,4.0   • Livello: 100 

A volte è necessario eseguire delle azioni quando un controllo WPF è in DesignMode o quando è in una normale esecuzione (run dell'applicazione WPF).
La classe DesignerProperties del namespace System.ComponentModel ci permette di sapere ciò:

VB.NET

If DesignerProperties.GetIsInDesignMode(Me.TextBox1) Then
    ' designer mode
Else
    ' run mode
End If

 

C#

if (DesignerProperties.GetIsInDesignMode(this.TextBox1))
{
     // Designer Mode
}
else
{
    // Running Mode
}


L'argomento del metodo GetIsInDesignMode può essere un qualsiasi UIElement.

Recuperare la risoluzione video in WPF

Scritto da Massimo Bonanni il 26 settembre 2011
Linguaggio: VB   • Framework: 3.5,4.0   • Livello: 100 

La seguente funzione recupera i dpi dello schermo.

VB.NET

Public Sub GetVideoResulution(ByRef xDpi As Double, ByRef yDpi As Double)
    xDpi = 0
    yDpi = 0
    If Application.Current.MainWindow IsNot Nothing Then
        Dim MainWnd = PresentationSource.FromVisual(Application.Current.MainWindow)
        If MainWnd IsNot Nothing Then
            Dim transMatrix = MainWnd.CompositionTarget.TransformToDevice
            xDpi = transMatrix.M11 * 96D
            yDpi = transMatrix.M22 * 96D
        End If
    End If
End Sub

 

Creare un PngBitmapEncoder a partire da un FrameworkElement

Scritto da Massimo Bonanni il 23 settembre 2011
Linguaggio: VB   • Framework: 3.5,4.0   • Livello: 100 

La seguente funzione consente di creare un oggetto PngBitmapEncoder (con il quale è possibile generare, ad esempio, una bitmap su disco) a partire da un Framework Element della nostra interfaccia.

VB.NET

Public Shared Function GetImageEncoderFromControl(ByVal controlToConvert As FrameworkElement,
                                                  ByVal pixelFormat As System.Windows.Media.PixelFormat,
                                                  Optional ByVal xDpi As Double = 96D,
                                                  Optional ByVal yDpi As Double = 96D) As PngBitmapEncoder
    Dim imageEncoder As PngBitmapEncoder = Nothing
    Try
        Dim transform = controlToConvert.LayoutTransform
 
        Dim sizeOfControl = New Windows.Size(CInt(controlToConvert.ActualWidth),
                                             CInt(controlToConvert.ActualHeight))
        controlToConvert.Measure(sizeOfControl)
        controlToConvert.Arrange(New Rect(sizeOfControl))
        Dim videoxDpi, videoyDpi As Double
        GetVideoResulution(videoxDpi, videoyDpi)
        Dim renderBitmap = New RenderTargetBitmap(CInt(sizeOfControl.Width * xDpi / videoxDpi),
                                                  CInt(sizeOfControl.Height * yDpi / videoyDpi),
                                                  xDpi,
                                                  yDpi,
                                                  pixelFormat)
        renderBitmap.Render(controlToConvert)
 
        Dim pngEncoder = New PngBitmapEncoder()
        pngEncoder.Frames.Add(BitmapFrame.Create(renderBitmap))
        imageEncoder = pngEncoder
    Catch ex As Exception
        imageEncoder = Nothing
    End Try
    Return imageEncoder
End Function

 

 Per ottenere l'oggetto Bitmap è sufficiente recuperare la proprietà Frame(0) dell'oggetto restituito.

Recuperare in maniera automatica in nome della proprietà corrente.

Scritto da Massimo Bonanni il 19 settembre 2011
Linguaggio: C#,VB   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

La classe proposta in questa pillola mette a disposizione un metodo che, se utilizzato all'interno del set o get di una property, restituisce il nome della property stessa.

VB.NET

Public NotInheritable Class PropertyHelper
    Private Sub New()
 
    End Sub
 
    Private Const SetPropertyPrefix = "set_"
    Private Const GetPropertyPrefix = "get_"
 
    Public Shared Function GetCurrentPropertyName() As String
        Dim retval As String = Nothing
        Dim method = (From sf In New StackTrace().GetFrames
                    Where sf.GetMethod().DeclaringType <> GetType(PropertyHelper)
                    Select sf.GetMethod()).FirstOrDefault()
        If method IsNot Nothing Then
            If method.Name.StartsWith(SetPropertyPrefix) Then
                retval = method.Name.Replace(SetPropertyPrefix, "")
            End If
            If method.Name.StartsWith(GetPropertyPrefix) Then
                retval = method.Name.Replace(GetPropertyPrefix, "")
            End If
        End If
        Return retval
    End Function
End Class

 

C#

public static class PropertyHelper
{
    private const string SetPropertyPrefix = "set_";
    private const string GetPropertyPrefix = "get_";
 
    public static string GetCurrentPropertyName()
    {
        string retval=null;
 
        var method=(from sf in new StackTrace().GetFrames()
                    where sf.GetMethod().DeclaringType != typeof(PropertyHelper)
                    select sf.GetMethod()).FirstOrDefault();
        if (method != null)
        {
            if (method.Name.StartsWith(SetPropertyPrefix))
            {
                retval=method.Name.Replace(SetPropertyPrefix,"");
            }
            if (method.Name.StartsWith(GetPropertyPrefix))
            {
                retval = method.Name.Replace(GetPropertyPrefix, "");
            }
        }
        return retval;
    }
}


La classe può essere utilizzata, ad esempio, in quelle classi in cui si implementa l'interfaccia INotifyPropertyChanged per non cablare il nome della proprietà all'interno dell'evento dell'interfaccia.

Evitare la richiesta di conferma per i file modificati fuori da Visual Studio

Scritto da Roberto Albano il 16 settembre 2011
Livello: 100 

Alcune volte può capitare che uno o più file inclusi in un progetto vengano modificati tramite altri applicativi esterni a Visual Studio stesso.
Al rientro nell'ambiente di sviluppo, ci si trova quindi una finestra di dialogo che ci avvisa che il file (o i file) sono stati modificati fuori dall'ambito di Visual Studio e ci chiede conferma per poterli ricaricare:

figura1

In alcune situazioni i file possono essere diversi, e quindi l'operazione di conferma può risultare una scocciatura inutile.
Se vogliamo evitare quindi questa conferma e far sì che Visual Studio ricarichi sempre i contenuti editati all'esterno del proprio ambiente senza chiedere ogni volta conferma, possiamo andare in Visual Studio nella sezione Tools > Options > Environment > Documents e spuntare la voce "Auto-load changes, if saved" presente subito sotto la voce "Detect when file is changed outside the environment":

figura2

 

Un metodo di estensione per recuperare i controlli di una pagina web in base al tipo

Scritto da Massimo Bonanni il 12 settembre 2011
Linguaggio: VB   • Framework: 3.5,4.0   • Livello: 100 

A volte può essere utile recuperare, all'interno di una pagina o di un controllo web contenitore, la lista dei controlli di un certo tipo. Il seguente metodo di estensione esegue questa operazione:

VB.NET

<Extension()> _
Public Function FindControlByTypeRecursive(ByVal container As Control, _
                                           ByVal controlType As Type) As IEnumerable(Of Control)
    Dim ctrlList As List(Of Control) = Nothing
    If container IsNot Nothing Then
        ctrlList = (From c In container.Controls.OfType(Of Control)() _
                    Where controlType.IsInstanceOfType(c) _
                    Select c).ToList()
        For Each ctrl In container.Controls.OfType(Of Control)()
           ctrlList.AddRange(ctrl.FindControlByTypeRecursive(controlType))
        Next
    End If
    Return ctrlList
End Function

 

Generare chiavi pseudocasuali a partire da una stringa ed un salt

Scritto da Pietro Libro il 09 settembre 2011
Linguaggio: C#,VB   • Framework: 2.0,3.0,3.5,4.0   • Livello: 200 

Quanto si lavora con le classi del namespace System.Security.Cryptography può capitare di dover inizializzare un algoritmo di cifratura (ad esempio Rijndael) che necessita di un vettore di inizializzazione (IV) ed una Key per poter funzionare correttamente. Per generare queste chiavi a partire da una stringa di testo (una password ad esempio), possiamo utilizzare un'istanza della classe System.Security.Cryptography.Rfc2898DeriveBytes, la quale espone un metodo GetBytes(int) che ad ogni chiamata genera una chiave pseudocasuale di lunghezza specificata dal parametro int.

C#

////Lunghezza minima dell'Salt = 8 byte.
byte[] salt = new byte[]{ 56,23,45,89,55,23,67,89};
System.Security.Cryptography.Rfc2898DeriveBytes d = new System.Security.Cryptography.Rfc2898DeriveBytes("password",salt );
            byte[] key=  d.GetBytes(16);

 

VB.NET

Dim salt As Byte() = New Byte() {56, 23, 45, 89, 55, 23, 67, 89}
Dim d As New System.Security.Cryptography.Rfc2898DeriveBytes("password", salt)
Dim key As Byte() = d.GetBytes(16)


Il generatore di numeri pseudo-casuali + basato sull'oggetto HMACSHA1.

Impostare il browser con cui eseguire il debug in Visual Studio 2010

Scritto da Roberto Albano il 05 settembre 2011
Livello: 100 

Quando Visual Studio 2010 esegue una operazione di debugging di una pagina web, normalmente apre una istanza del browser che è impostato nel sistema come browser di default.
Per esempio io uso Firefox come browser di default, quindi Visual Studio avvia la pagina che deve andare in debug in quel browser. Personalmente, però, preferisco utilizzare Internet Explorer per questo scopo.
La cosa da fare è semplicemente andare nel Solution Explorer, selezionare un file .aspx, fare click con il tasto destro del mouse e selezionare la voce "Browse with" :

figura1

Si aprirà una finestra di dialogo che ci consentirà di scegliere il browser con cui vogliamo eseguire il default e nel caso non sia presente possiamo anche aggiungerlo:

figura2

Come commentare i namespace in SandCastle

Scritto da Angelo Stefani il 05 agosto 2011
Livello: 100 

Utilizzando il tag XML <summary> possiamo commentare i namespace del nostro codice ma SandCastle lo ignora bellamente.
Per poter comunque generare una documentazione di progetto che abbia i giusti commenti per i namespace si può utilizzare il seguente stratagemma:

  1. Creare un file di codice (ad esempio con il nome NamespaceDoc.vb) in un punto qualsiasi del progetto da documentare (ad esempio nella root);
  2. Inserire all'interno del file una classe NamespaceDoc per ogni namespace da documentare decorata con l'attributo CompilerGenerated (in modo da non essere utilizzabile nel codice). Ad esempio supponiamo di avere due namespace MioNamespace.Namespace1 e MioNamespace.Namespace2:

 VB.NET

Namespace MioNamespace.Namespace1
    ''' <summary>
    ''' Commento su Namespace1
    ''' </summary>
    ''' <remarks></remarks>
    <System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)> _
    <System.Runtime.CompilerServices.CompilerGenerated()> _
    Friend Class NamespaceDoc
        Private Sub New()
 
        End Sub
    End Class
End Namespace
 
Namespace MioNamespace.Namespace2
    ''' <summary>
    ''' Commento su Namespace2
    ''' </summary>
    ''' <remarks></remarks>
    <System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)> _
    <System.Runtime.CompilerServices.CompilerGenerated()> _
    Friend Class NamespaceDoc
        Private Sub New()
 
        End Sub
    End Class
End Namespace

Come ricavare il numero di elementi nel cestino e la loro dimensione

Scritto da Massimo Bonanni il 01 agosto 2011
Linguaggio: VB   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

Per poter ricavare il numero di elementi nel cestino di windows e la loro dimensione possiamo ricorrere alla tecnica del P/Invoke ed utilizzare l'API SHQueryRecycleBin contenuta nella shell32.dll.
La seguente classe implementa un metodo per recuperare numero di elementi e dimensione (in bytes) degli stessi:

VB.NET

Imports System.Runtime.InteropServices
Public Class RecycleBinHelper
    Private Const S_OK = 0
 
    <DllImport("shell32.dll")>
    Private Shared Function SHQueryRecycleBin(ByVal pszRootPath As String, ByRef pSHQueryRBInfo As SHQUERYRBINFO) As Integer
    End Function
 
    Public Shared Function GetSize(ByRef numItems As Integer, ByRef totalSize As Int64) As Boolean
        Dim retval = False
        Dim shrb = New SHQUERYRBINFO()
        shrb.cbSize = Marshal.SizeOf(GetType(SHQUERYRBINFO))
        If SHQueryRecycleBin(String.Empty, shrb) = S_OK Then
            totalSize = shrb.i64Size
            numItems = CInt(shrb.i64NumItems)
            retval = True
        End If
        Return retval
    End Function
 
    <StructLayout(LayoutKind.Sequential, Pack:=4)>
    Private Structure SHQUERYRBINFO
        Public cbSize As Int32
        Public i64Size As Long
        Public i64NumItems As Long
    End Structure
End Class

 

 

Come svuotare il cestino di Windows

Scritto da Massimo Bonanni il 29 luglio 2011
Linguaggio: VB   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

Per poter svuotare il cestino di windows si può ricorrere all'uso dell'API SHEmptyRecycleBin contenuta nella dll shell32.dll.
Il codice riportato implementa un metodo per lo svuotamento del cestino:

VB.NET

Imports System.Runtime.InteropServices
Public Class RecycleBinHelper
     Private Const S_OK = 0
     Private Const S_Empty = -2147418113
 
     <DllImport("shell32.dll")>
     Private Shared Function SHEmptyRecycleBin(ByVal hWnd As IntPtr, ByVal pszRootPath As String, ByVal           dwFlags As UInt32) As Integer
     End Function
 
     Public Shared Function Empty(Optional ByVal flags As RecycleBinOptions = 0) As Boolean
          Dim retval = True
          Dim hresult = SHEmptyRecycleBin(IntPtr.Zero, String.Empty, CUInt(flags))
          If hresult <> S_OK And hresult <> S_Empty Then
               retval = False
          End If
          Return retval
     End Function
End Class
 
<Flags()>
Public Enum RecycleBinOptions
     NoConfirmation = 1
     NoProgressUI = 2
     NoSound = 4
End Enum

 

Le opzioni consentono di eliminare la conferma di cancellazione, il sonoro o finestra di avanzamento.

Usare una stringa di connessione esistente per il model Entity Framework

Scritto da Roberto Albano il 25 luglio 2011
Linguaggio: C#   • Framework: 4.0   • Livello: 100 

A molti di voi sarà capitato di lavorare su un progetto dove è necessario avere nel file di config una stringa di connessione "classica" e in cui, aggiungendo un model basato su Entity Framework, di ritrovarsi una seconda stringa "ad hoc" per il model.
E in molti casi la prima non può essere eliminata perché magari esiste una parte della solution non mappata (e in certi casi non mappabile) sul datamodel appena introdotto, per cui… bisogna tenersi entrambi le stringhe.
Nel nostro esempio abbiamo un model basato su Entity Framework creato con il nome di MyModel per cui ci ritroveremo, nel file web.config, una sezione del genere:

<connectionStrings>
  <add name="MyConnectionString"
       connectionString="Server=mysrv\myinst;Database=mycatalog;Integrated Security=True" />
  <add name="MyModel"
       connectionString="metadata=res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl;
                         provider=System.Data.SqlClient;
                         provider connection string=
                             &quot;Data Source=mysrv\myinst;Initial Catalog=mycatalog;
                             Integrated Security=True;MultipleActiveResultSets=True&quot;"
      providerName="System.Data.EntityClient" />
</connectionStrings>

 

Si può notare che le stringhe di connessione sono leggermente diverse, dato che la stringa per il model richiede anche le indicazioni degli schemi necessari alla mappatura dei dati.
Per raggiungere il nostro scopo, dovremo "estendere" la classe del model, aggiungendo una classe in partial al model stesso, che si chiamerà proprio MyModel.

public partial class MyModel
{
    // ...
}

 

 In questa classe creeremo una istanza singleton del model stesso, utilizzando una proprietà statica:

// istanza statica privata da creare una sola volta
private static MyModel context = null;
// istanza statica pubblica da usare
public static MyModel Context
{
    get
    {
        if (context == null)
        {
            context = CreateModelContext("MyConnectionString", "MyModel");
        }
        return context;
    }
}

 

Come si può notare, la proprietà restituisce l'istanza privata, preoccupandosi di inizializzarla se questa è ancora null (quindi se siamo di fatto nel primo utilizzo della proprietà stessa).

L'inizializzazione viene fatta tramite un metodo a cui vengono indicati il nome della connessione e il nome della classe del model:

/// <summary>
/// Restituisce una istanza del model a partire da una connessione esistente nel file di config
/// </summary>
/// <param name="ConnStringName">Il nome della stringa di connessione</param>
/// <param name="ModelName">Il nome della classe del model</param>
/// <returns>Ritorna una istanza del model</returns>
private static MyModel CreateModelContext(string ConnStringName, string ModelName)
{
    // recupero dal file di config la connection string già esistente 
    ConnectionStringSettings sqlconn = ConfigurationManager.ConnectionStrings[ConnStringName];
    // inizializzo una istanza di EntityConnectionStringBuilder che ci consentirà di creare la
    // connection per il model, e in questa valorizzo la proprietà "ProviderConnectionString" con
    // la connection string appena recuperata
    EntityConnectionStringBuilder ef = new EntityConnectionStringBuilder();
    ef.Provider = "System.Data.SqlClient";
    ef.ProviderConnectionString = sqlconn.ConnectionString;
    ef.Metadata = string.Format(@"res://*/{0}.csdl|res://*/{0}.ssdl|res://*/{0}.msl", ModelName);
    // ritorno l'istanza del model creata
    return new MyModel(ef.ToString());
}

 

 

Aumentare la dimensione massima dei file in upload con ASP.NET

Scritto da Massimo Bonanni il 22 luglio 2011
Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

Se in un nostro web site utilizziamo il controllo FileUpload per permettere agli utenti di uploadare dei files sul nostro server, ci scontriamo con il fatto che, per default, la dimensione massima di tali file non può essere superiore ai 4Mb. Per modificare questa impostazione si può agire sull'elemento <httpruntime> del file di configurazione web.config ed impostare l'attributo MaxRequestLength.
Ad esempio, le seguenti impostazioni portano la dimensione massima dei files a 1Gb:

 
<httpRuntime maxRequestLength="1048576" />
 

 

Scrivere un elemento nella cartella dei preferiti di IE

Scritto da Massimo Bonanni il 18 luglio 2011

La seguente funzione consente di scrivere un elemento all'interno dei preferiti di Internet Explorer:

VB.NET

Public Function AddFavorite(ByVal name As String, _
                            ByVal url As String, _
                            Optional ByVal subFolder As String = Nothing) As Boolean
  Dim folder = Environment.GetFolderPath(Environment.SpecialFolder.Favorites)
  Dim shortcut As New System.Text.StringBuilder
  With shortcut
    .AppendLine("[InternetShortcut]")
    .AppendFormat("URL={0}", url)
  End With
  Dim filename As String
  If String.IsNullOrWhiteSpace(subFolder) Then
    filename = String.Concat(name, ".url")
  Else
    filename = System.IO.Path.Combine(subFolder, String.Concat(name, ".url"))
  End If
  filename = System.IO.Path.Combine(folder, filename)
  Try
    System.IO.File.WriteAllText(filename, shortcut.ToString())
    Return System.IO.File.Exists(filename)
  Catch ex As Exception
    Return False
  End Try
End Function

 

C#

public Boolean AddFavorite(String name, String url, string subFolder)
{
  String folder = Environment.GetFolderPath(Environment.SpecialFolder.Favorites);
  System.Text.StringBuilder shortcut = new System.Text.StringBuilder();
  shortcut.AppendLine("[InternetShortcut]");
  shortcut.AppendFormat("URL={0}", url);
  String filename = null;
  if (String.IsNullOrWhiteSpace(subFolder))
  {
    filename = String.Concat(name, ".url");
  } else {
    filename = System.IO.Path.Combine(subFolder, String.Concat(name, ".url"));
  }
  filename = System.IO.Path.Combine(folder, filename);
  try
  {
    System.IO.File.WriteAllText(filename, shortcut.ToString());
    return System.IO.File.Exists(filename);
  }
  catch (Exception)
  {
    return false;
  }
}

 

Cambiare la master page di una pagina ASPX

Scritto da Massimo Bonanni il 15 luglio 2011
Linguaggio: C#,VB   • Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

Per poter cambiare la master page di una pagina aspx possiamo impostare, all'interno della pagina, la seguente proprietà:

VB.NET

 
Me.MasterPageFile = "~/masterpage.master"
 

 

C#

 
this.MasterPageFile = "~/masterpage.master";
 

 

La modifica di questa ha effetto solo se la effettuata nell'evento PreInit della pagina.

Differenze tra ISNULL e COALESCE

Scritto da Antonio Giglio il 11 luglio 2011
Livello: 100 

In sql server ci sono due funzioni utilizzate per ritornare il primo valore non nullo da un'espressione.

  1. IsNull( check_expression , replacement_value )
  2. Coalesce( expression [ ,...n ] )

Coalesce è una funzione, aggiunta nello standard ANSI SQL-92, che si traduce in CASE…END.
Ad esempio il richiamo alla funzione COALESCE (V1, V2, . . . ,n ) si traduce come: CASE WHEN V1 IS NOT NULL THEN V1 ELSE COALESCE (V2, . . . ,n ) END.

Differente è il caso di IsNull che è una funzione T-SQL ed accetta solo due parametri.

Il tipo di dati ritornato segue delle regole diverse:

  • la funzione IsNull utilizza il tipo di dato del primo parametro;
  • la funzione Coalesce invece segue le regole dettate dall'espressione CASE e ritorna il tipo  con maggiore priorità.

Un'altra differenza è relativa all'eventualità che tutti i parametri siano nulli, ovvero il risultato di SELECT IsNull(null,null) è un'espressione corretta che ritorna un tipo int nullo, mentre il risultato di SELECT Coalesce(null,null) ci ritorna un errore perchè sql server non è in grado di dare una priorità al tipo di dati.
Sempre a causa della maggiore priorità, il risultato di Coalesce([int], [decimal(19,2)]) è di tipo decimal(19,2) differentemente da IsNull([int], [decimal(19,2)]) che è di tipo int.
Non per ultimo il fattore delle performance che spesso sono peggiori nell'utilizzo di Coalesce.

Questo fa la differenza, nell'utilizzo di queste espressioni, in colonne calcolate, nella creazione di vincoli di chiave o se sono utilizzate come valore di ritorno di una UDF.

Forzare il motore di rendering di IE8 e IE9

Scritto da Massimo Bonanni il 08 luglio 2011
Livello: 100 

E' possibile forzare il motore di rendering di IE8 per rappresentare la nostra pagina web come se ci trovassimo in una delle versioni precedenti del browser.
Per fare ciò possiamo utilizzare il tag meta:

 
<meta http-equiv="X-UA-Compatible" content="XXXX" >
 

 

 Dove XXXX può essere uno dei seguenti valori:

  • IE=9  La pagina è visualizzata nello standard mode di IE9;
  • IE=8  La pagina è visualizzata nello standard mode di IE8;
  • IE=7  La pagina è visualizzata in modalità IE7;
  • IE=5  La pagina è visualizzata in modalità IE5; 
  • IE=EmulateIE9  Se nella pagina c'è la specifica di un DocType standard, allora la pagina è visualizzata in modalità IE9, altrimenti in modalità IE5; 
  • IE=EmulateIE8  Se nella pagina c'è la specifica di un DocType standard, allora la pagina è visualizzata in modalità IE8, altrimenti in modalità IE5;
  • IE=EmulateIE7  Se nella pagina c'è la specifica di un DocType standard, allora la pagina è visualizzata in modalità IE7, altrimenti in modalità IE5;
  • IE=Edge  La pagina è visualizzata nella più recente modalità disponibile per il browser.

Ad esempio, il seguente tag definisce che la pagina deve essere visualizzata in modalità IE8:

 
<meta http-equiv="X-UA-Compatible" content="IE=8" >
 

 

Ricavare gli items non selezionati in una CheckedListBox

Scritto da Massimo Bonanni il 04 luglio 2011
Linguaggio: C#,VB   • Framework: 3.5,4.0   • Livello: 100 

La proprietà CheckedItems di una CheckedListBox ci fornisce l'elenco degli items selezionati. Per ottenere, invece, gli items non selezionati possiamo ricorrere ad una semplice query LINQ:

VB.NET

Dim nonChecked = From i In Me.CheckedListBox1.Items _
                 Where Not CheckedListBox1.CheckedItems.Contains(i) _
                 Select i

 

C#

var noChecked = from i in this.checkedListBox1.Items.OfType<object>()
                where !this.checkedListBox1.CheckedItems.Contains(i)
                select i;

 

Aggiornare controlli da thread secondari con Invoke

Scritto da Massimo Bonanni il 01 luglio 2011
Linguaggio: VB   • Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

Le applicazioni windows forms sono STA (Single Thread Apartment) il che significa che un controllo dell'interfaccia grafica può essere modificato solo dal thread che lo possiede (tipicamente il thread principale dell'applicazione).
Per poter effettuare una modifica da un thread secondario possiamo utilizzare il metodo Invoke e la proprietà InvokeRequired della classe Control.
Supponiamo di voler modificare il controllo denominato MyControl:

VB.NET

Private Delegate Sub UpdateMyControlDelegate()
Public Sub UpdateMyControl()
   If MyControl.InvokeRequired Then ' verifico se mi trovo in un thread non proprietario del controllo
       MyControl.Invoke(New UpdateMyControlDelegate(AddressOf UpdateMyControl)) ' Rieseguo il metodo UpdateMyControl come se mi trovassi mel thread proprietario
   Else
       '
       ' Codice che si occupa di modificare effettivamente il controllo
       '
    End If
End Sub

 

 

Recuperare la data di installazione del sistema operativo

Scritto da Massimo Bonanni il 27 giugno 2011
Linguaggio: C#,VB   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

La seguente funzione permette di recuperare la data di installazione del sistema operativo:

VB.NET

Imports System.Management
Imports System.Globalization
 
Public Function InstallDateSO() As DateTime?
    Dim dtmInstallDate As DateTime? = Nothing
    Dim oSearcher As New ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem")
    Dim oMgmtObj = oSearcher.Get().OfType(Of ManagementObject)().FirstOrDefault()
    If oMgmtObj IsNot Nothing Then
        Dim str = oMgmtObj("InstallDate").ToString()
        dtmInstallDate = System.DateTime.ParseExact(str.Substring(0, str.Length - 4),
                                                    "yyyyMMddHHmmss.ffffff",
                                                    CultureInfo.InvariantCulture)
    End If
    Return dtmInstallDate
End Function

 

C#

using System.Management;
using System.Globalization;
 
public DateTime? InstallDateSO()
{
    DateTime? dtmInstallDate = null;
    var oSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem");
    var oMgmtObj = oSearcher.Get().OfType<ManagementObject>().FirstOrDefault();
    if (oMgmtObj != null)
    {
        string strValue = oMgmtObj.GetPropertyValue("InstallDate").ToString();
        dtmInstallDate = System.DateTime.ParseExact(strValue.Substring(0, strValue.Length - 4),
                                                    "yyyyMMddHHmmss.ffffff",
                                                    CultureInfo.InvariantCulture);
    }
    return dtmInstallDate;
}


Ulteriori proprietà ricavabili tramite WMI sono riportate all'indirizzo http://msdn.microsoft.com/en-us/library/aa394084(v=VS.85).aspx.

Impostare l'input focus al caricamento di una web form aspx

Scritto da Massimo Bonanni il 24 giugno 2011
Linguaggio: C#,VB   • Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

Per l'input focus al caricamento di una web form (cioè il controllo che riceve l'input nel momento in cui la form viene visualizzata) si può utilizzare l'attributo defaultfocus del tag form:

 
<form id="form1" runat="server" defaultfocus="myTextBox" >
 

 

 La proprietà si può, ovviamente, impostare anche da codice settando la proprietà DefaultFocus dell'oggetto HtmlForm esposto dalla pagina tramite la proprietà Form:

VB.NET

 
Me.Form.DefaultFocus = "myTextBox"
 

 

C#

 
this.Form.DefaultFocus = "myTextBox";
 

 

Impostare il tasto di default su una web form aspx

Scritto da Massimo Bonanni il 20 giugno 2011
Linguaggio: C#,VB   • Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

Per impostare un bottone di default in una web form (cioè il bottone che viene premuto nel momento in cui l'utente schiacciail tasto INVIO) si può utilizzare l'attributo defaultbutton del tag form:

 
<form id="form1" runat="server" defaultbutton="Button1" >
 

 

La proprietà si può, ovviamente, impostare anche da codice settando la proprietà DefaultButton dell'oggetto HtmlForm esposto dalla pagina tramite la proprietà Form:

VB.NET

 
Me.Form.DefaultButton="Button1"
 

 

C#

 
this.Form.DefaultButton="Button1";
 

 

 

Serializzare gli oggetti con il formato del ViewState

Scritto da Massimo Bonanni il 17 giugno 2011
Linguaggio: C#,VB   • Framework: 3.5,4.0   • Livello: 100 

La seguente classe consente di serializzare/deserializzare un oggetto in formato JSON.

VB.NET

Imports System.Runtime.Serialization.Json
Imports System.IO
Imports System.Text
 
Public NotInheritable Class SerializzatoreJSON(Of T As New)
 
    Private Sub New()
 
    End Sub
 
    Public Shared Function Serializza(ByVal oggetto As T) As String
        If oggetto Is Nothing Then Throw New ArgumentNullException("Oggetto non può essere null")
        Dim strJSON As String = Nothing
        Dim serializer = New DataContractJsonSerializer(GetType(T))
        Using memStream = New MemoryStream()
            serializer.WriteObject(memStream, oggetto)
            strJSON = Encoding.Default.GetString(memStream.ToArray())
        End Using
        Return strJSON
    End Function
 
    Public Shared Function Deserializza(ByVal strOggetto As String) As T
        Dim retObj As T
        Dim serializer = New DataContractJsonSerializer(GetType(T))
        Using memStream = New MemoryStream(Encoding.Default.GetBytes(strOggetto))
            retObj = CType(serializer.ReadObject(memStream), T)
        End Using
        Return retObj
    End Function
End Class

 

C#

public sealed class SerializzatoreJSON<T>
    where T : new()
{
    private SerializzatoreJSON()
    {
 
    }
 
    public static string Serializza(T oggetto)
    {
        if (oggetto == null) throw new ArgumentNullException("Oggetto non può essere null");
        string strJSON = null;
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
        using (MemoryStream memStream = new MemoryStream())
        {
            serializer.WriteObject(memStream, oggetto);
            strJSON = Encoding.Default.GetString(memStream.ToArray());
        }
        return strJSON;
    }
 
    public static T Deserializza(string strOggetto)
    {
        T retObj;
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
        using (MemoryStream memStream = new MemoryStream(Encoding.Default.GetBytes(strOggetto)))
        {
            retObj = (T)serializer.ReadObject(memStream);
        }
        return retObj;
    }
}

 

La classe DataContractJsonSerializer si trova nell'assembly System.Runtime.Serialization nel caso in cui si stia lavorando con il framework 4.0 mentre si trova nell'assembly System.ServiceModel.Web se si lavora con il framewor 3.5.

Ricavare le proprietà definite come chiavi di una classe Linq2Sql

Scritto da Massimo Bonanni il 13 giugno 2011
Linguaggio: C#,VB   • Framework: 3.5,4.0   • Livello: 100 

Analizzando gli attribributi delle proprietà di una classe generata dal designer di Linq to SQL è possibile ricavare quali di queste sono chiavi univoche.

VB.NET

Imports System.Data.Linq.Mapping
Imports System.Reflection
 
Public Function GetPropertyKey(ByVal entityType As Type) As IEnumerable(Of String)
  Dim retval As IEnumerable(Of String) = Nothing
  Try
    retval = From p In entityType.GetProperties() _
            Where p.GetCustomAttributes(GetType(ColumnAttribute), True).Count > 0 _
            AndAlso CType(p.GetCustomAttributes(GetType(ColumnAttribute), True).First(), ColumnAttribute).IsPrimaryKey _
            Select p.Name
  Catch ex As Exception
    retval = Nothing
  End Try
  Return retval
End Function

 

C#

using System.Data.Linq.Mapping;
using System.Reflection;
 
public IEnumerable<string> GetPropertyKey(Type entityType)
{
  IEnumerable<string> retval = null;
  try
  {
      retval = from p in entityType.GetProperties()
               where p.GetCustomAttributes(typeof(ColumnAttribute), true).Length > 0
               && ((ColumnAttribute)p.GetCustomAttributes(typeof(ColumnAttribute), true).First()).IsPrimaryKey
               select p.Name;
 
  }
  catch (Exception)
  {
      retval = null;
  }
  return retval;
}

 

 E' necessario referenziare l'assembly System.Data.Linq.

Conoscere l’operatore ‘?’ (Ternary Operator) e l’operatore ‘??’ (Double Question Mark Operator)

Scritto da Roberto Albano il 10 giugno 2011
Linguaggio: C#   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

Molto cari ai "puristi" del codice, questi operatori consentono di effettuare rapidamente operazioni di verifica e assegnazione del valore di una istanza.

Un esempio vale più di mille parole, per cui vediamo subito che il seguente snippet di codice:

MyClass myInstance = null;
if (myObject != null)
{
    myInstance = myObject;
}
else
{
    myInstance = new MyClass();
}

 

può essere scritto, in virtù del cosiddetto "Ternary Operator", in questo modo:

 
MyClass myInstance = (myObject != null) ? myObject : new MyClass();
 

 

oppure, grazie all'operatore "Double Question Mark Operator", anche in questo modo:

 
MyClass myInstance = myObject ?? new MyClass();
 

 

In questo caso il risultato sarà lo stesso, ma il funzionamento dei due operatori è differente.
Spieghiamo meglio il tutto.

Il "Ternary Operator" funziona in questo modo:

 
myInstance = (condition) ? value_if_condition_is_true : value_if_condition_is_false;
 

 

ovvero, se la condizione (condition) è verificata, allora assegna alla variabile myInstance il valore value_if_condition_is_true altrimenti assegna il valore value_if_condition_is_false.

 Il "Double Question Mark Operator" funziona invece in questo modo:

 
myInstance = value_to_assign_if_it_is_not_null ?? value_to_assign_rather;
 

 

ovvero, myInstance viene valorizzato con value_to_assign_if_it_is_not_null se questo appunto non è un valore null, altrimenti viene assegnato il valore value_to_assign_rather (che tra l'altro potrebbe anche essere null ma non viene ulteriormente controllato).

Quindi mentre il "Ternary Operator" verifica una generica condizione, il "Double Question Mark Operator" verifica se il valore in assegnazione sia valorizzato, altrimenti considera il successivo valore proposto.

Da notare che entrambi gli operatori possono essere combinati in maniera molto elastica, realizzando espressioni complesse e talvolta anche "criptiche" consentendoci di scrivere, per esempio, anche cose del genere:

MyClass temp = null;
myInstance = ( (temp = myObject1 ?? myObject2 ?? myObject3) != null) ? temp : new MyClass();

 

 

Convertire un immagine in un array di byte e viceversa

Scritto da Massimo Bonanni il 06 giugno 2011
Linguaggio: C#,VB   • Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

A volte può servire convertire un immagine in un array di byte (per esempio per salvare l'immagine in una banca dati).
Le seguenti funzioni eseguono le operazioni di conversione di un'immagine da e verso un array di byte.

VB.NET

Public Shared Function ConvertImageToByteArray(ByVal imageToConvert As Image) As Byte()
    Dim ret As Byte() = Nothing
    Try
        Using ms As New MemoryStream
            imageToConvert.Save(ms, imageToConvert.RawFormat)
            ret = ms.ToArray()
        End Using
    Catch ex As Exception
        ret = Nothing
    End Try
    Return ret
End Function
 
Public Shared Function ConvertByteArrayToImage(ByVal byteArrayIn As Byte()) As Image
    Dim retImage As Image = Nothing
    Try
        Using ms = New MemoryStream(byteArrayIn)
            retImage = Image.FromStream(ms)
        End Using
    Catch ex As Exception
        retImage = Nothing
    End Try
    Return retImage
End Function

 

C#

public static byte[] ConvertImageToByteArray(Image imageToConvert)
{
    byte[] ret = null;
    try
    {
        using (MemoryStream ms = new MemoryStream())
        {
            imageToConvert.Save(ms, imageToConvert.RawFormat);
            ret = ms.ToArray();
        }
    }
    catch (Exception ex)
    {
        ret = null;
    }
    return ret;
}
 
public static Image ConvertByteArrayToImage(byte[] byteArrayToConvert)
{
    Image ret = null;
    try
    {
        using (MemoryStream ms = new MemoryStream(byteArrayToConvert))
        {
            ret=Image.FromStream(ms);
        }
    }
    catch (Exception ex)
    {
        ret = null;
    }
    return ret;
}

 

 

Differenza tra cast esplicito e uso del comando 'as'

Scritto da Roberto Albano il 03 giugno 2011
Linguaggio: C#   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

Per effettuare una conversione da un tipo A ad un tipo B, si può pensare di eseguire un cast esplicito:

A a = new A();
B b = (B)a;

 

oppure si può utilizzare il comando 'as':

A a = new A();
B b = (a as B);

 

Tuttavia le due tipologie di conversione sono differenti per comportamento, per valore di ritorno e anche per istruzioni del compilatore utilizzate.

Andiamo a vedere queste differenze:

  1. innanzitutto il cast esplicito ritorna una exception in caso di errori nella conversione, mentre nello stesso caso il comando 'as' ritorna semplicemente un valore null
  2. anche in virtù del punto 1, in caso di utilizzo del comando 'as' è necessario che il tipo B del nostro esempio sia sempre un reference type o almeno un nullable type (come ad esempio int?), mentre nel caso del cast esplicito questo non è necessario
  3. con il cast esplicito è possibile utilizzare conversioni definite dall'utente nella class (user-defined conversions, per esempio nel caso di due classi senza nessuna relazione tra loro), mentre con il comando 'as' questo non è consentito
  4. infine, scendendo al livello dell'Intermediate Language (IL), le istruzioni utilizzate (OpCode) sono diverse, infatti mentre un cast esplicito viene tradotto in IL con l'istruzione  'castclass', per il comando 'as' si fa ricorso all'istruzione 'isinst'

Sebbene in alcuni casi l'uso del comando 'as' possa risultare leggermente più veloce rispetto al cast esplicito, la scelta dell'uno o dell'altro sistema dipende molto dallo scenario in cui è necessario effettuare la conversione. 

Ricavare il campo della tabella di database a cui è collegata una proprietà di una classe Linq2Sql

Scritto da Massimo Bonanni il 30 maggio 2011
Linguaggio: C#,VB   • Framework: 3.5,4.0   • Livello: 100 

Le proprietà delle classi generate dal designer di Linq To SQL sono decorate con l'attributo ColumnAttribute in cui è indicata la colonna (preceduta dal carattere "_") della tabella della banca dati SQL a cui la proprietà è collegata.

E' possibile recuperare, da codice, il nome della colonna andando a leggere il valore dell'attributo.

VB.NET

Imports System.Data.Linq.Mapping
Imports System.Reflection
     
Public Function GetEntityField(ByVal entityType As Type, ByVal propertyName As String) As String
    Dim retval As String = Nothing
    Try
        Dim entityProp = (From p In entityType.GetProperties() _
                         Where String.Compare(p.Name, propertyName, True) = 0 _
                         Select p).FirstOrDefault()
        If entityProp IsNot Nothing Then
            Dim attrib = CType(entityProp.GetCustomAttributes(GetType(ColumnAttribute), True).FirstOrDefault(), ColumnAttribute)
            If attrib IsNot Nothing Then
                retval = attrib.Storage.Substring(1, attrib.Storage.Length - 1)
            End If
        End If
    Catch ex As Exception
        retval = Nothing
    End Try
    Return retval
End Function

 

 C#

using System.Data.Linq.Mapping;
using System.Reflection;
  
public string GetEntityField(Type entityType, String propertyName)
{
    string retval = null;
    try
    {
        PropertyInfo entityProp = (from p in entityType.GetProperties()
                                   where string.Compare(p.Name, propertyName, true) == 0
                                   select p).FirstOrDefault<PropertyInfo>();
        if (entityProp != null)
        {
            ColumnAttribute attrib = (ColumnAttribute)entityProp.GetCustomAttributes(typeof(ColumnAttribute), true).FirstOrDefault<object>();
            if (attrib != null)
            {
                retval = attrib.Storage.Substring(1, attrib.Storage.Length - 1);
            }
        }
    }
    catch (Exception)
    {
        retval = null;
    }
    return retval;
}

 

 E' necessario referenziare l'assembly System.Data.Linq.

Supportiamo gli Enum in EF4.1 CodeFirst

Scritto da Antonio Pierascenzi il 27 maggio 2011
Linguaggio: C#   • Framework: 4.0   • Livello: 200 

Sicuramente sarà capitato di doversi scontrare con questa "mancanza" in fase di configurazione del mapping del nostro modello di dominio con il modello dati fornitoci da EF4.
CodeFirst soffre ovviamente di questa problematica come annunciato dallo stesso team di sviluppo di EF.
Per sopperire a questa mancanza possiamo applicare un workaround basato sull'utilizzo di una classe che fa da wrapper al nostro enum e che potrà essere interpretata, ad esempio, dall'engine di CodeFirst come un Complex Type, dopo averla dichiarata tale in fase di configurazione del Context. (vedi precedenti post sul tema).

// enum type
public enum Sex
{
Male=1,
Female=2
}

// wrapper class for enum support in EF4
public class TypeSex
{
public int Value { get; private set; }
public TypeSex(int value)
{
Value = value;
}
public TypeSex(Sex sex)
{
Value = (int)sex;
}
//perform implicit conversion
public static implicit operator int(TypeSex typeSex)
{
return typeSex.Value;
}
public static implicit operator TypeSex (int value)
{
return new TypeSex(value);
}
public static implicit operator Sex(TypeSex typeSex )
{
return (Sex)typeSex.Value;
}
public static implicit operator TypeSex (Sex sex)
{
return new TypeSex (sex);
}
}

La classe come vediamo opera delle conversioni implicite sul tipo che dobbiamo persistere.Per maggiori info. http://msdn.microsoft.com/en-us/library/z5z9kes2.aspx.
Di seguito un banalissimo esempio d'uso delle classe TypeSex che "sostituisce", come proprietà della classe Person, l'iniziale enum Gender.

// using on class person example
public class Person
{
public String Name { get; set; }
public String Surname { get; set; }
public DateTime? DateOfBirth { get; set; }
//use wrapper classe for EF4 support
public TypeSex Gender { get; set; }
}

Creare un unico eseguibile contenente altre librerie.

Scritto da Luca Cestola il 23 maggio 2011
Livello: 100 

Può risultare molto comodo poter distribuire un'applicazione composta semplicemente di un unico eseguibile anche quando si utilizzano librerie di terze parti. Per ottenere questo risultato si può utilizzare l'utility ilmerge.

Possiamo utilizzarlo in questo modo:

ilmerge /target:winexe /lib:"C:\Windows\Microsoft.NET\Framework\v4.0.30319"
        /lib:"C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies"
        /out:EseguibileUnico.exe EguibileOriginale.exe Libreria1.dll Libreria2.dll

 

 Se non si è dei patiti della linea di comando possiamo utilizzare ILMerge-GUI disponibile su codeplex.

Ricavare la tabella di database a cui è collegata una classe Linq2Sql

Scritto da Massimo Bonanni il 20 maggio 2011
Linguaggio: C#,VB   • Framework: 3.5,4.0   • Livello: 100 

Le classi generate dal designer di Linq To SQL sono decorate con l'attributo TableAttribute in cui è indicata la tabella della banca dati SQL a cui la classe è collegata. E' possibile recuperare, da codice, il nome della tabella andando a leggere il valore dell'attributo.

VB.NET

Imports System.Data.Linq.Mapping
  
Public Function GetEntityTable(ByVal entityType As Type) As String
    Dim retval As String = Nothing
    Try
        Dim attrib = CType(entityType.GetCustomAttributes(GetType(TableAttribute), True).FirstOrDefault(), TableAttribute)
        If attrib IsNot Nothing Then
            retval = attrib.Name
        End If
    Catch ex As Exception
        retval = Nothing
    End Try
    Return retval
End Function

 

 C#

using System.Data.Linq.Mapping;
 
public string GetEntityTable(Type entityType)
{
    string retval = null;
    try
    {
        TableAttribute attrib = (TableAttribute)entityType.GetCustomAttributes(typeof(TableAttribute), true).FirstOrDefault<object>();
        if (attrib != null)
        {
            retval = attrib.Name;
        }
    }
    catch (Exception)
    {
        retval = null;
    }
    return retval;
}

 

 E' necessario referenziare l'assembly System.Data.Linq.

Configurazioni tramite Fluent Api in EF4.1 Code First

Scritto da Antonio Pierascenzi il 16 maggio 2011
Linguaggio: C#   • Framework: 4.0   • Livello: 200 

Abbiamo visto in un post precedente come configurare una proprietà chiave utilizzando le Fluent Api in EF 4.1; se avessimo l'esigenza, per la stessa entità, di dover configurare altri elementi potremmo utilizzare una classe specifica. Attraverso le seguenti righe di codice, oltre a definire un campo chiave per l'entità, definiamo il tipo nvarchar(MAX) , di default nell'ultima versione ma serve solo a scopi didattici, e la lunghezza. Inoltre, elemento più importante, con la keyword Ignore impostiamo la proprietà Description come non mappabile dall'engine di CodeFirst.
Con l'ultima riga impostiamo il nome della tabella che deve essere mappata sul database per l'entità in oggetto.

public class MyClassConfiguration :EntityTypeConfiguration<MyClass>
{
     public MyClassConfiguration()
       {
         //define property key and database generated option, identity in this case, and table generated column order.
         HasKey(p => p.Uid).Property(c => c.Uid).HasDatabaseGeneratedOption( DatabaseGeneratedOption.Identity).HasColumnOrder(1);
        // define column type (default nvarchar(MAX) last release) and columnlength
         Property(p => p.Name).HasColumnType("nvarchar(MAX)").HasMaxLength(4000);
       //Ignore mapping on specific property
       Ignore(p=>p.Description);
       // declare table name
         ToTable("MyTableName");
       }
}

Fatto questo non resta che, in fase di definizione del nostro Context, aggiungere nel metodo di override, OnModelCreating, del builder del modello, la classe custom di configurazione della nostra entità, dove abbiamo configurato anche un'entità Address come ComplexType e rimosso una convenzione di default ( OneToManyCascadeDeleteConvention)

// Define class context
public class Context : DbContext
{
  // constructor override database name if necessary or leave null, in this case will be created with context name
  public Context() : base("Test_EF") { }
  // define property DbSet
  public DbSet<MyClass> MyClasses{ get; set; }
  //override model creating method
  protected override void OnModelCreating(DbModelBuilder modelBuilder)
  {
   // apply custom configuration
   modelBuilder.Configurations.Add(new MyClassConfiguration());
   // define complex type example with Fluent Api
   modelBuilder.ComplexType<Address>();
   // Custom conventions overriding
   modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
  }
}

Metodi parziali

Scritto da Luca Cestola il 13 maggio 2011
Linguaggio: C#,VB   • Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

Oltre a permette di definire una classe su più file, la keyword partial permette di separare l'intestazione ed il corpo di un metodo.

Un semplice esempio:

VB.NET

' Definizione
Partial Private Sub Log()
End Sub

' Implementazione
Private Sub Log()
MessageBox.Show("Sono in un partial method.")
End Sub
 

 

C#

// Definizione
partial void Log();

// Implementazione
partial void Log()
{
MessageBox.Show("Sono in un partial method.");
}

 

L'utilità di un metodo Partial è che possiamo fornire o meno la parte di implementazione. Nel caso in cui l'implementazione non sia fornita il compilatore provvederà "al volo" ad eliminare le chiamate a tale metodo. In questo modo possiamo definire dei metodi che possono essere utili in una certa fase dello sviluppo e che possiamo eliminare in una fase successiva, semplicemente commentando l'implementazione, senza dover eliminare da tutto il codice le chiamate a tale metodo.

I metodi partial hanno le seguenti caratteristiche e limitazioni:

  • Le dichiarazioni di metodi parziali devono iniziare con la parola chiave contestuale partial e il metodo deve restituire void.
  • I metodi parziali possono contenere il parametro ref ma non il parametro out.
  • I metodi parziali sono implicitamente private e pertanto non possono essere virtual.
  • I metodi parziali non possono essere extern, perché la presenza del corpo determina se è in corso una definizione o un'implementazione.
  • I metodi parziali possono contenere modificatori static e unsafe.
  • I metodi parziali possono essere generici. I vincoli vengono inseriti nella dichiarazione di definizione del metodo parziale e possono essere ripetuti facoltativamente nella dichiarazione di implementazione. I nomi dei parametri e dei parametri di tipo non devono essere uguali nella dichiarazione di implementazione e in quella di definizione.
  • È possibile creare un delegato di un metodo parziale che è stato definito e implementato, ma non di un metodo parziale che è stato solo definito.

Stored Procedure in Entity Framework 4.1

Scritto da Pietro Libro il 09 maggio 2011
Linguaggio: C#,VB   • Framework: 4.0   • Livello: 100 

Secondo delle necessità, abbiamo acluni workaround per eseguire una Stored Procedure (SP) con la nuova versione di Entity Framework. Possiamo utilizzare il metodo SqlQuery esposto dalla proprietà Database, a sua volta presente nella classe derivante dal DbContext, SqlQuery esposto da DbSet<>, rappresentate una collezione di entità, o utilizzare il metodo ExceuteSqlCommand presente nella classe Database. Nel primo caso, supponendodi avere una entità "Persona", potremmo scrivere qualcosa del tipo:

C#

db.Database.SqlQuery<Persona>("EXECUTE LoadPersonaByName @Param1",
                                new SqlParameter("Param1", "Pietro"));

 

VB.NET

db.Database.SqlQuery(Of Persona)("EXECUTE LoadPersonaByName @Param1", _
                                 New SqlParameter("Param1", "Pietro"))

 

dove SqlQuery<...> restituisce un IEnumerable del tipo generico specificato. Oppure potremmo scrivere:

C#

db.Persone.SqlQuery("EXECUTE LoadPersonaByName @Param1",
                    new SqlParameter("Param1", "Pietro"));

 

VB.NET

db.Persone.SqlQuery("EXECUTE LoadPersonaByName @Param1", _
                    New SqlParameter("Param1", "Pietro"))

 

Ottenendo ancora un IEnumerable di "Persona", ma con una sostanziale differenza: nel primo caso i risultati restituiti non sono "tracciati" dal contesto corrente e di conseguenza eventuali modifiche alle entità non sarebbero prese in considerazione, nel secondo caso sì. Il terzo metodo citato per l'esecuzione di SP è l'utilizzo di ExecuteSqlCommand:

C#

db.Database.ExecuteSqlCommand("EXECUTE DeletePersonaByName @Param1",
                                new SqlParameter("Param1", "Pietro"));

 

VB.NET

db.Database.ExecuteSqlCommand("EXECUTE DeletePersonaByName @Param1", _
                                New SqlParameter("Param1", "Pietro"))

 

in questo caso, il valore di ritorno è un intero. Attenzione: affinchè una SP possa essere mappata su di un'entità, come nei primi due casi, è necessario utilizzare la keyword 'as' nella definizione dello statement SQL per mappare i nomi di colonna con i nomi delle proprietà dell'entità.

Definire obsoleta una classe o un membro di una classe.

Scritto da Massimo Bonanni il 06 maggio 2011
Linguaggio: C#,VB   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

Se vogliamo fare in modo che una o più classi oppure che uno o più membri di una classe (proprietà, metodi, attributi) non vengano più utilizzati perchè non più efficienti la strada più corretta non è certamente quella di eliminare le suddette classi o i membri dai nostri applicativi perchè questo potrebbe portare alla non compilazione del pogetto.
La modalità migliore per segnalare a chi utilizza le nostre classi che le classi stesse o uno o più membri di queste non devono essere utilizzatate è decorare le classi o i membri con l'attributo Obsolete.
L'attributo Obsolete consente di segnalare, con un warning (o, addirittura con un errore), la necessità di non utilizzare l'entità con un messaggio che possiamo inserire.
Un esempio di utilizzo è il seguente:

VB.NET

<Obsolete("La classe è obsoleta!!")>
Public Class ClasseObsoleta
End Class

 

C#

[Obsolete("La classe è obsoleta!!")]
class ClasseObsoleta
{
}


Chi utilizza la classe ClasseObsoleta otterrà una segnalazione con un warning associato al messaggio "La classe è obsoleta!!".
In maniera analoga l'attributo può essere utilizzato su un metodo:

VB.NET

<Obsolete("Il metodo è obsoleto!!", True)>
Public Sub MetodoObsoleto()
End Sub

 

C#

[Obsolete("Il metodo è obsoleto!!",true)]
public void MetodoObsoleto
{
}


In questo caso si ottiene un errore anzichè un warning.

Ricavare un colore WPF a partire dal nome

Scritto da Massimo Bonanni il 02 maggio 2011
Linguaggio: C#,VB   • Framework: 3.0,3.5,4.0   • Livello: 100 

La classe Color di System.Windows.Media mette a disposizione il metodo FromArgb() per recuperare un colore a partire dalle componenti Rosso, Verde e Blu e dalla componente Alfa ma non permette di ricavare un colore a partire dalla stringa indicante il suo nome (ad esempio "Red" per il rosso).
La seguente funzione consente di recuperare l'oggetto Color a partire dal nome:

VB.NET

Public Function GetColorFromName(ByVal strColor As String) As Color?
    Dim retColor As Color? = Nothing
    Try
        Dim propColor = GetType(Colors).GetProperty(strColor)
        If propColor IsNot Nothing Then
            Dim value = propColor.GetValue(Nothing, Nothing)
            If value IsNot Nothing Then
                retColor = CType(value, Color)
            End If
        End If
    Catch ex As Exception
        retColor = Nothing
    End Try
    Return retColor
End Function

 

C#

public Nullable<Color> GetColorFromName(string strColor)
{
    Nullable<Color> retColor = null;
    try
    {
        var propColor = typeof(Colors).GetProperty(strColor);
        if (propColor != null)
        {
            var value = propColor.GetValue(null, null);
            if (value != null)
            {
                retColor = (Color)value;
            }
        }
    }
    catch (Exception)
    {
        retColor = null;
    }
 
    return retColor;
}

 

Abilitare HttpContext in un servizio WCF

Scritto da Massimo Bonanni il 29 aprile 2011
Linguaggio: C#,VB   • Framework: 3.0,3.5,4.0   • Livello: 100 

Un servizio WCF può essere consumato con diversi protocolli e, per questo, di default, non ha abilitato l'HttpContext.
In sostanza se tentiamo di utilizzare HttpContext.Current, questa è Nothing (null).
Per abilitare l'utilizzo dell'HttpContext (ed accedere, quindi a HttpContext.Current) è necessario inserire il seguente tag nel Web.Config:

<system.serviceModel>
     <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
</system.serviceModel>

 

 e decorare la classe di servizio con il seguente attributo:

VB.NET

<AspNetCompatibilityRequirements(RequirementsMode:=AspNetCompatibilityRequirementsMode.Allowed)>
Public Class Service1
    Implements IService1
         .
         .
End Class

 

C#

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class Service1: IService1
{
         .
         .
}

 

Concatenare un url assoluto ed uno relativo

Scritto da Massimo Bonanni il 25 aprile 2011
Linguaggio: C#,VB   • Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

Per ottenre un url valido concatenando un url assoluto e un url relativo possiamo utilizzare la seguente funzione:

VB.NET

Public Function GetAbsoluteUrl(rootUrl As String, relativeUrl As String) As String
    Dim relativeUri = New Uri(relativeUrl, UriKind.Relative)
    Dim rootUri = New Uri(rootUrl, UriKind.Absolute)
    Return New Uri(rootUri, relativeUri).AbsoluteUri
End Function

 

C#

public string GetAbsoluteUrl(string rootUrl, string relativeUrl)
{
     var relativeUri = new Uri(relativeUrl, UriKind.Relative);
     var rootUri = new Uri(rootUrl, UriKind.Absolute);
     return new Uri(rootUri, relativeUri).AbsoluteUri;
}


Ad esempio:

VB.NET

 
Dim url = GetAbsoluteUrl("/", "path/subpath/pagina.aspx")
 

 

C#

 
var url = GetAbsoluteUrl("/", "path/subpath/pagina.aspx");
 

 

Ricavare il numero del mese a partire dal nome

Scritto da Massimo Bonanni il 22 aprile 2011
Linguaggio: C#,VB   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

La seguente funzione permette di ricavare il numero del mese a partire dal nome:

VB.NET

Public Shared Function GetMonthNumberFromString(strMonth As String,
                                                culture As CultureInfo) As Integer
    For index = 1 To 12
        Dim tmpDate = New DateTime(1, index, 1)
        Dim month = tmpDate.ToString("MMMM", culture)
        If String.Compare(month, strMonth, True) = 0 Then
            Return index
        End If
    Next
    Return -1
End Function

 

C#

public static int GetMonthNumberFromString(string strMonth, CultureInfo culture)
{
   for (index = 1; index <= 12; index++) {
      var tmpDate = new DateTime(1, index, 1);
      var month = tmpDate.ToString("MMMM", culture);
      if (string.Compare(month, strMonth, true) == 0) {
         return index;
      }
   }
   return -1;
}

 

Differenza tra == e Equals

Scritto da Roberto Albano il 18 aprile 2011
Linguaggio: C#   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

Molti pensano che nella comparazione tra due oggetti si possa utilizzare in maniera indifferente sia l'operatore di uguaglianza '==' sia il metodo Equals (presente già dalla classe object).

Questo in realtà non è vero dato che, in base al tipo di comparazione, si possono ottenere risultati diversi.

Partiamo subito con un esempio:

int i1 = 100;
int i2 = 100;
bool b1 = ( i1 == i2 );       // true
bool b2 = ( i1.Equals(i2) );  // true
 
StringBuilder sb1 = new StringBuilder("prova");
StringBuilder sb2 = new StringBuilder("prova");
bool b3 = ( sb1 == sb2 );       // false
bool b4 = ( sb1.Equals(sb2) );  // true

 

Questo succede perché la comparazione tra value types (come nel caso degli int) avviene sempre a livello di valore, quindi '==' ed Equals si comportano allo stesso modo, mentre nella comparazione tra reference types (come nel caso della classe StringBuilder) questo avviene a livello di puntamento per '==' e a livello di valore per Equals.

Di fatto Equals è un metodo della classe object, che può essere sottoposto ad "override" (cioè a ridefinizione) nelle classi in cui si abbia la necessità di definire l'uguaglianza in maniera diversa. 

public override bool Equals(object obj)
{
    // ...
}

 

Quindi nella classe StringBuilder il metodo Equals verifica il valore (in questo caso della stringa) presente nell'istanza mentre l'operatore '==' verifica se fisicamente gli oggetti della comparazione rappresentino effettivamente lo stesso oggetto (ovvero se puntano di fatto allo stesso spazio di memoria).

Qualcuno noterà subito che se eseguiamo un codice del genere: 

string s1 = "prova";
string s2 = "prova";
bool b5 = ( s1 == s2 );       // true
bool b6 = ( s1.Equals(s2) );  // true

 

otterremo sempre un'uguaglianza, anche se la classe string è, di fatto, un reference type.
In questo caso nella classe string è stato fatto un "override" dell'operatore '==':

public static bool operator == (object obj1, object obj2)
{
    // ...
}

 

(per completezza diciamo che nella classe string è stato ridefinito in maniera analoga anche l'operatore '!=')

Teniamo sempre bene a mente la possibilità di dover eseguire questi "override" quando sviluppiamo le nostre classi. 

SQL Server - Estrarre valori distinti da una stringa

Scritto da Antonio Giglio il 15 aprile 2011

Come facciamo a visualizzare i valori distinti di una colonna di tipo stringa ignorando i vincoli di case-insensity/accent-insensity che abbiamo settato all'atto di creazione del nostro database?

Per questo esempio utilizzeremo un resultset con una colonna "Valore" generato dalla query:

select 'caffè' as Valore
  union all select 'CafFe'
  union all select 'caffe'

 

Il nostro resultset è:

Figura1

Adesso effettuiamo la query per estrarre i valori distinti del nostro resultset:

select distinct Valore from
( select 'caffè' as Valore
  union all select 'CafFe'
  union all select 'caffe' ) as tabella

 

Il risultato della query è:

Figura2

Il nostro database utilizza una collation sequence case-insensity (in quanto le maiuscole e le minuscole sono trattate allo stesso modo) ed accent-sensity (in quanto le accentate sono trattate diversamente dalle non accentate), proviamo quindi a cambiare la collation sequence utilizzando la select:

select distinct Valore COLLATE sql_latin1_general_cp1_ci_ai
from
( select 'caffè' as Valore
  union all select 'CafFe'
  union all select 'caffe' ) as tabella

 

Semplicemente cambiando la collation possiamo estrarre i dati diversamente da come è settato il nostro database, la clausola COLLATE, aggiunta nella selezione della nostra colonna, ci consente di agire diversamente sul risultato della DISTINCT, infatti il risultato è:

Figura3

Ancora, cambiando la collation:

select distinct Valore COLLATE sql_latin1_general_cp1_cs_as
from
( select 'caffè' as Valore
  union all select 'CafFe'
  union all select 'caffe' ) as tabella

 

 Semplicemente cambiando la collation possiamo estrarre i dati diversamente da come è settato il nostro database, la clausola COLLATE, aggiunta nella selezione della nostra colonna, ci consente di agire diversamente sul risultato della DISTINCT, infatti il risultato è:

Figura4

La lista delle COLLATIONS disponibili, completa di descrizione la otteniamo con la query:

SELECT *
FROM fn_helpcollations()

 

 

Figura5

Impostare una proprietà chiave con Entity Framework Code First

Scritto da Antonio Pierascenzi il 11 aprile 2011
Framework: 4.0   • Livello: 100 

Durante la creazione del nostro dominio e volendo utilizzare l'approccio CodeFirst di Entity Framework, arrivato alla versione 4.1, è possibile definire elementi chiave delle nostre entità quei campi che normalmente non vengono considerati tali, ricordiamo infatti che, per convenzione, CodeFirst considera chiavi le proprietà delle nostre entità aventi nome "Key", "Id" oppure "nomeentitàId" , "nomeentitàkey".
Per far diventare chiave ad esempio una proprietà avente nome "CodiceArticolo" dobbiamo aggiungere l'attributo [key] alla proprietà della classe, tale attributo fa parte del namespace System.ComponentModel.DataAnnotations.
Possiamo anche raggiungere lo stesso obiettivo tramite Fluent Api in fase di definizione del context attraverso la scrittura, nel metodo in override OnModelCreating(DbModelBuilder modelBuilder), delle seguenti righe di codice :

modelBuilder.Entity<Ordine>()
.HasKey(p => p.CodiceArticolo).Property(c => c.CodiceArticolo)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

 

Con le quali impostiamo anche il campo come identity.

Metodo di estensione FindControl web ricorsivo

Scritto da Massimo Bonanni il 08 aprile 2011
Linguaggio: C#,VB   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

Il seguente metodo di estensione implementa un FindControl ricorsivo:

VB

<Extension()> _
Public Function FindControlRecursive(ByVal container As Control, _
                                    ByVal controlID As String) As Control
  Dim ctrlRet As Control = Nothing
  If container IsNot Nothing Then
    ctrlRet = container.FindControl(controlID)
    If ctrlRet Is Nothing Then
      For Each ctrl As Control In container.Controls
        ctrlRet = ctrl.FindControlRecursive(controlID)
        If ctrlRet IsNot Nothing Then Exit For
      Next
    End If
  End If
  Return ctrlRet
End Function

 

C#

public static Control FindControlRecursive(this Control container,
                                                String controlID)
{
  Control ctrlRet = null;
  if (container != null)
  {
    ctrlRet = container.FindControl(controlID);
    if (ctrlRet == null)
    {
      foreach (Control ctrl in container.Controls)
      {
        ctrlRet = ctrl.FindControlRecursive(controlID);
        if (ctrlRet != null) break;
      }
    }
  }
  return ctrlRet;
}

 

Eliminare una chiave di registro

Scritto da Massimo Bonanni il 04 aprile 2011
Linguaggio: C#,VB   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

Se vogliamo la chiave SOFTWARE\MiaAzienda\MiaChiave al di sotto della chiave di registro HKEY_CURRENT_USER:

VB.NET

Dim regKey As RegistryKey = Nothing
Try
  Registry.CurrentUser.DeleteSubKeyTree("SOFTWARE\\MiaAzienda", True)
Catch ex As Exception
 
Finally
  If regKey IsNot Nothing Then regKey.Close()
End Try

 

C#

RegistryKey regKey = null;
try
{
  Registry.CurrentUser.DeleteSubKeyTree("SOFTWARE\\MiaAzienda", true);
}
catch (Exception)
{
}
finally
{
  if (regKey != null) regKey.Close();
}

 

 

Cancellare un valore in una chiave di registro

Scritto da Massimo Bonanni il 01 aprile 2011
Linguaggio: C#,VB   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

Se vogliamo cancellare il valore MioValore di tipo String della chiave SOFTWARE\MiaAzienda\MiaChiave al di sotto della chiave di registro HKEY_CURRENT_USER:

VB.NET

Dim regKey As RegistryKey = Nothing
Try
   regKey = Registry.CurrentUser.OpenSubKey("SOFTWARE\\MiaAzienda\\MiaChiave", True)
   If regKey IsNot Nothing Then
      regKey.DeleteValue("MioValore")
   End If
Catch ex As Exception
Finally
   If regKey IsNot Nothing Then regKey.Close()
End Try

 

C#

RegistryKey regKey = null;
try
{
  regKey = Registry.CurrentUser.OpenSubKey("SOFTWARE\\MiaAzienda\\MiaChiave", true);
  if (regKey != null)
  {
    regKey.DeleteValue("MioValore");
  }
}
catch (Exception)
{
}
finally
{
  if (regKey != null) regKey.Close();
}

 

Inserire un valore in una chiave di registro

Scritto da Massimo Bonanni il 28 marzo 2011
Linguaggio: C#,VB   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

Se vogliamo aggiungere il valore MioValore di tipo String nella chiave SOFTWARE\MiaAzienda\MiaChiave al di sotto della chiave di registro HKEY_CURRENT_USER:

VB.NET

Dim regKey As RegistryKey = Nothing
Try
  regKey = Registry.CurrentUser.OpenSubKey("SOFTWARE\\MiaAzienda\\MiaChiave", True)
  If regKey IsNot Nothing Then
    regKey.SetValue("MioValore", "Valore", RegistryValueKind.String)
  End If
Catch ex As Exception
 
Finally
  If regKey IsNot Nothing Then regKey.Close()
End Try

 

C#

RegistryKey regKey = null;
try
{
  regKey = Registry.CurrentUser.OpenSubKey("SOFTWARE\\MiaAzienda\\MiaChiave", true);
  if (regKey != null)
  {
    regKey.SetValue("MioValore", "Valore", RegistryValueKind.String);
  }
}
catch (Exception)
{
}
finally
{
  if (regKey != null) regKey.Close();
}

 

La classe Registry è presente nel namespace Microsoft.Win32.

Creare una chiave di registro

Scritto da Massimo Bonanni il 25 marzo 2011
Linguaggio: C#,VB   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

Se vogliamo creare, ad esempio, la chiave SOFTWARE\MiaAzienda\MiaChiave al di sotto della chiave di registro HKEY_CURRENT_USER:

VB.NET

Dim regKey As RegistryKey = Nothing
Try
  regKey = Registry.CurrentUser.CreateSubKey("SOFTWARE\\MiaAzienda\\MiaChiave")
Catch ex As Exception
 
Finally
  If regKey IsNot Nothing Then regKey.Close()
End Try

 

C#

RegistryKey regKey = null;
try
{
  regKey = Registry.CurrentUser.CreateSubKey("SOFTWARE\\MiaAzienda\\MiaChiave");
}
catch (Exception)
{
}
finally
{
  if (regKey != null) regKey.Close();
}

 

La classe Registry è presente nel namespace Microsoft.Win32.

Eliminare ore, minuti, secondi e millisecondi da un datetime SQL Server

Scritto da Antonio Giglio il 21 marzo 2011
Livello: 100 

Esistono principalmente 3 metodi per estrarre la data da un datetime (cioè ricavare la parte relativa ad una data a partire da un datetime):

  1. Classico, ovvero la trasformazione in stringa e la successiva conversione in datetime:

    SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), GETDATE(), 120), 120)
    

     

  2. Utilizzare la conversione in float della data per poi recuperare le sole cifre intere e la successiva conversione in datetime:

    SELECT CONVERT(DATETIME, FLOOR(CONVERT(FLOAT, GETDATE() ) ) )
    

     

  3. Aggiungere al giorno "0", la quantità di giorni estratti a partire dal giorno "0" del datetime:

    SELECT DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE() ), 0)
    

     

Nei precedenti esempi è stata utilizzata la data corrente (GETDATE()) ma può essere utilizzato un qualsiasi campo di tipo DATETIME.

Il metodo più lento è quello che sfrutta la conversione in stringa (1), mentre il metodo più veloce è aggiungere i giorni a partire dal giorno "0" (3).

In Sql Server 2008 esiste un quarto metodo che sfrutta il nuovo tipo Date:

SELECT CONVERT(DATETIME,CONVERT(DATE,GETDATE()))

 

 In quest'ultimo caso abbiamo effettuato un'ulteriore conversione a datetime per ottenere lo stesso risultato dei tre precedenti metodi, ma non è necessario in quanto il risultato della prima conversione è già una data senza ore, minuti, secondi e millisecondi.

Recuperare un'icona da un eseguibile utilizzando PInvoke

Scritto da Massimo Bonanni il 18 marzo 2011
Linguaggio: C#,VB   • Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

Se vogliamo recuperare un'icona da un eseguibile (anche non .NET) possiamo utilizzare una API presente nella dll shell32.dll.
Il seguente metodo esegue esattamente questo:

VB.NET

<DllImport("shell32.dll")> _
Private Shared Function ExtractIcon(ByVal hInst As IntPtr, _
                                  ByVal lpszExeFileName As String, _
                                  ByVal nIconIndex As Integer) As IntPtr
End Function

Public Shared Function ExtractIconFromFile(ByVal FileName As String, _
                                           ByVal Index As Integer) As Icon
    Dim tmpIcon As System.Drawing.Icon = Nothing
    Dim iHandle As IntPtr
    iHandle = ExtractIcon(IntPtr.Zero, FileName, Index)
    If iHandle <> IntPtr.Zero Then
         tmpIcon = System.Drawing.Icon.FromHandle(iHandle)
    End If
    Return tmpIcon
End Function

 

C#

[DllImport("shell32.dll")]
static extern IntPtr ExtractIcon(IntPtr hInst, string lpszExeFileName, int nIconIndex);
 
public static Icon ExtractIconFromFile(String FileName, Int32 Index)
{
    Icon tmpIcon = null;
    IntPtr iHandle;
    iHandle = ExtractIcon(IntPtr.Zero, FileName, Index);
    if (iHandle != IntPtr.Zero)
        tmpIcon = System.Drawing.Icon.FromHandle(iHandle);
    return tmpIcon;
}


In entrambi i linguaggi va importato il namespace System.Runtime.InteropServices.

Calcolo preciso della durata di un'operazione

Scritto da Massimo Bonanni il 14 marzo 2011
Linguaggio: C#,VB   • Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

VB.NET

Imports System.Diagnostics
 
.
.
.
 
Dim stopWatch As Stopwatch = stopWatch.StartNew()
'
' Operazione da misurare
'
stopWatch.Stop()
Dim elapsedMSec = stopWatch.ElapsedMilliseconds

 

C#

using System.Diagnostics;
 
.
.
.
 
Stopwatch stopWatch = Stopwatch.StartNew();
///
/// Operazione da misurare
///
stopWatch.Stop();
long elapsedMSec = stopWatch.ElapsedMilliseconds;

 

Aggiungere un Header alla risposta Http in ASP.NET

Scritto da Alessandro Mostarda il 11 marzo 2011
Linguaggio: C#,VB   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

C#

HttpContext.Current.Response.AddHeader("headerkey", "headervalue");

 

VB.NET

HttpContext.Current.Response.AddHeader("headerkey", "headervalue")

Inserire degli items in una ComboBox in maniera performante

Scritto da Massimo Bonanni il 07 marzo 2011
Linguaggio: C#,VB   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

A volte si ha la necessità di riempire un controllo ComboBox (per Windows Form)  senza utilizzare il binding ma aggiungendo elementi alla collezione Items.
Ogni volta che si richiama il metodo Add() della proprietà Items (di tipo ComboBox.ObjectCollection), il framework ridisegna la combobox in virtù dei cambiamenti avvenuti e facendo perdere tempo in una procedura di inserimento massivo.
Per evidare ciò è possibile utilizzare il metodo BeginUpdate() immediatamente prima di cominciare a riempire la collezione Items e il metodo EndUpdate() al termine del riempimento.

VB.NET

Me.ComboBox1.BeginUpdate()
For i = 1 To 10000
  Me.ComboBox1.Items.Add(i)
Next
Me.ComboBox1.EndUpdate()

 

C#

this.comboBox1.BeginUpdate();
for (int i = 1; i &lt;= 10000; i++)
{
  this.comboBox1.Items.Add(i);
}
this.comboBox1.EndUpdate();

 

 Questi metodi sono disponibili anche su ListView, ListBox e CheckedListBox.

Recuperare i dettagli relativi agli aggiornamenti disponibili con Click-Once

Scritto da Massimo Bonanni il 04 marzo 2011
Linguaggio: C#,VB   • Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

Per recuperare informazioni dettagliate riguardo eventuali aggiornamenti disponibili con Click-Once, possiamo utilizzare la classe UpdateCheckInfo:

VB.NET

Dim appDep = ApplicationDeployment.CurrentDeployment
Dim updInfo = appDep.CheckForDetailedUpdate() ' Classe UpdateCheckInfo
If updInfo.UpdateAvailable Then ' Aggiornamenti diponibili
    Dim required = updInfo.IsUpdateRequired ' Indica se l'update è necessario
    Dim minVer = updInfo.MinimumRequiredVersion  ' Versione minima dell'applicazione
    Dim actVer = updInfo.AvailableVersion   ' Versione disponibile
    Dim updSize = updInfo.UpdateSizeBytes ' Dimensione dell'aggiornamento (in bytes)
End If

 

C#

ApplicationDeployment appDep = ApplicationDeployment.CurrentDeployment;
UpdateCheckInfo updInfo = appDep.CheckForDetailedUpdate();
if (updInfo.UpdateAvailable){ // Aggiornamenti diponibili
    bool required = updInfo.IsUpdateRequired; // Indica se l'update è necessario
    Version minVer = updInfo.MinimumRequiredVersion;  // Versione minima dell'applicazione
    Version actVer = updInfo.AvailableVersion;  // Versione disponibile
    Int64 updSize = updInfo.UpdateSizeBytes; // Dimensione dell'aggiornamento (in bytes)
}

 

Per poter utilizzare la classe ApplicationDeployment è necessario referenziare l'assembly System.Deployment e importare il namespace System.Deployment.Application.

Come verificare se l'applicazione distribuita con Click-Once ha aggiornamenti

Scritto da Massimo Bonanni il 28 febbraio 2011
Linguaggio: C#,VB   • Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

Per capire se sono disponibili aggiornamenti per la nostra applicazione distribuita con Click-Once è sufficiente:

VB.NET

Dim appDep = ApplicationDeployment.CurrentDeployment
If appDep.CheckForUpdate() Then
  ' aggiornamenti presenti
End If

 

C#

ApplicationDeployment appDep = ApplicationDeployment.CurrentDeployment;
if (appDep.CheckForUpdate())
{
   //Aggiornamenti disponibili
}

 

Per poter utilizzare la classe ApplicationDeployment è necessario referenziare l'assembly System.Deployment e importare il namespace System.Deployment.Application.
E' possibile controllare la disponibilità degli aggiornamenti anche in modalità asincrona utilizzando il metodo CheckForUpdateAsync().

Metodo di estensione per clonare una Bitmap ridimensionandola

Scritto da Massimo Bonanni il 25 febbraio 2011
Linguaggio: C#,VB   • Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

Questo semplice metodo di estensione accetta un oggetto di classe System.Drawing.Bitmap e ne restituisce una copia ridimensionata in base a un fattore x e un fattore y:

VB.NET

<Extension()> _
Public Function CloneResize(ByVal image As System.Drawing.Bitmap, _
                            ByVal zoomFactorWidth As Double, _
                            ByVal zoomFactorHeight As Double) As System.Drawing.Bitmap
    If image Is Nothing Then Throw New ArgumentNullException("image")
    Dim width = image.Width
    Dim height = image.Height
    Dim newImage = New System.Drawing.Bitmap(image, _
                          Convert.ToInt32(width * zoomFactorWidth), _
                          Convert.ToInt32(height * zoomFactorHeight))
    Return newImage
End Function

 

C#

public static System.Drawing.Bitmap CloneResize(this System.Drawing.Bitmap image,
                                                double zoomFactorWidth,
                                                double zoomFactorHeight)
{
  if (image == null) throw new ArgumentNullException("image");
  Int32 width = image.Width;
  Int32 height = image.Height;
  System.Drawing.Bitmap newImage =  new System.Drawing.Bitmap(image,
                        Convert.ToInt32(width * zoomFactorWidth),
                        Convert.ToInt32(height * zoomFactorHeight));
  return newImage;
}

 

 

Serializzare oggetti in JSON

Scritto da Massimo Bonanni il 21 febbraio 2011
Linguaggio: C#,VB   • Framework: 3.5,4.0   • Livello: 100 

La seguente classe consente di serializzare/deserializzare un oggetto in formato JSON.

VB.NET

Imports System.Runtime.Serialization.Json
Imports System.IO
Imports System.Text

Public NotInheritable Class SerializzatoreJSON(Of T As New)

    Private Sub New()

    End Sub

    Public Shared Function Serializza(ByVal oggetto As T) As String
        If oggetto Is Nothing Then Throw New ArgumentNullException("Oggetto non può essere null")
        Dim strJSON As String = Nothing
        Dim serializer = New DataContractJsonSerializer(GetType(T))
        Using memStream = New MemoryStream()
            serializer.WriteObject(memStream, oggetto)
            strJSON = Encoding.Default.GetString(memStream.ToArray())
        End Using
        Return strJSON
    End Function

    Public Shared Function Deserializza(ByVal strOggetto As String) As T
        Dim retObj As T
        Dim serializer = New DataContractJsonSerializer(GetType(T))
        Using memStream = New MemoryStream(Encoding.Default.GetBytes(strOggetto))
            retObj = CType(serializer.ReadObject(memStream), T)
        End Using
        Return retObj
    End Function
End Class

 

C#

public sealed class SerializzatoreJSON<T>
    where T : new()
{
    private SerializzatoreJSON()
    {

    }

    public static string Serializza(T oggetto)
    {
        if (oggetto == null) throw new ArgumentNullException("Oggetto non può essere null");
        string strJSON = null;
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
        using (MemoryStream memStream = new MemoryStream())
        {
            serializer.WriteObject(memStream, oggetto);
            strJSON = Encoding.Default.GetString(memStream.ToArray());
        }
        return strJSON;
    }

    public static T Deserializza(string strOggetto)
    {
        T retObj;
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
        using (MemoryStream memStream = new MemoryStream(Encoding.Default.GetBytes(strOggetto)))
        {
            retObj = (T)serializer.ReadObject(memStream);
        }
        return retObj;
    }
}


La classe DataContractJsonSerializer si trova nell'assembly System.Runtime.Serialization nel caso in cui si stia lavorando con il framework 4.0 mentre si trova nell'assembly System.ServiceModel.Web se si lavora con il framewor 3.5.

Come bloccare lato-client il PostBack lato-server di un asp:Button

Scritto da Giorgio Di Nardo il 18 febbraio 2011
Linguaggio: JS   • Livello: 100 

Quando si voglia controllare (ed eventualmente annullare) il post-back di un ASP.NET Button, è possibile utilizzare la proprità OnClientClick per fare eseguire del codice Javascript che esegua le opportune verifiche. Se tale codice restituisce il valore false, il post-back lato-server viene cancellato.

E' il caso del pulsante MyButton che restituisce il risultato della funzione checkData:

<asp:Button ID="MyButton" runat="server" Text="Conferma" OnClientClick="return checkData()" OnClick="MyButton_Click" />


La funzione checkData esegue i controlli opportuni e restituisce true o false per confermare o cancellare il post-back.

<script type="text/javascript">
function checkData() {
var isValid = false;
[...]
return isValid;
}
</script>

Come capire se l'applicazione è stata distribuita con Click-Once

Scritto da Massimo Bonanni il 14 febbraio 2011
Linguaggio: C#,VB   • Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

Per capire se la nostra applicazione è stata distribuita utilizzando Click-Once è sufficiente effettuare il seguente test:

VB.NET

If ApplicationDeployment.IsNetworkDeployed Then
    ' applicazine distribuita via rete
End If

 

C#

if (ApplicationDeployment.IsNetworkDeployed )
{
  //Applicazione distribuita in rete
}

 

Per poter utilizzare la classe ApplicationDeployment è necessario referenziare l'assembly System.Deployment e importare il namespace System.Deployment.Application.

Recuperare tutti gli assembly referenziati dalla nostra applicazione

Scritto da Massimo Bonanni il 11 febbraio 2011
Linguaggio: VB   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

La classe Assembly mette a disposizione il metodo GetReferencedAssembly che permette, a partire da un'istanza di Assembly di recuperare gli AssemblyName relativi agli Assembly da esso referenziato.

Tale metodo, però, recupera solamente il primo livello di reference. Vale a dire che se nella nostra applicazione utilizziamo una dll la quale, a sua volta, utilizza altre dll, il metodo restituirà solamente l'assembly relativo alla prima dll.

IL seguente Extension Method della classe Assembly utilizza il metodo GetReferencedAssembly per eseguire una ricerca ricorsiva al fine di recuperare tutti gli assembly referenziati:

Imports System.Runtime.CompilerServices
Imports System.Reflection

Module AssemblyExtension

    <Extension()> _
    Public Sub GetAllReferencedAssemblies(ByVal sourceAssembly As Assembly,
                                         ByVal allowGacAssembly As Boolean,
                                         ByVal list As ICollection(Of AssemblyName))
        If sourceAssembly Is Nothing Then Throw New ArgumentNullException("Source Assembly")
        If list Is Nothing Then Throw New ArgumentNullException("Destination List")
        list.Add(sourceAssembly.GetName())
        If allowGacAssembly OrElse Not sourceAssembly.GlobalAssemblyCache Then
            Dim assemblies = sourceAssembly.GetReferencedAssemblies()
            For Each assemblyName In assemblies
                Dim query = From a In list _
                            Where a.FullName = assemblyName.FullName _
                            Select a
                If query.Count = 0 Then
                    Dim assembly As Assembly = assembly.Load(assemblyName.FullName)
                    assembly.GetAllReferencedAssemblies(allowGacAssembly, list)
                End If
            Next
        End If
    End Sub
End Module

 

Attenzione: per assembly referenziato si intende un assembly del quale è utilizzato almeno un tipo contenuto.

Forzare il refresh di tutte le proprietà con INotifyPropertyChanged

Scritto da Marco Amendola il 07 febbraio 2011
Linguaggio: C#   • Framework: 3.5,4.0   • Livello: 100 

Le classi che implementano l'interfaccia INotifyPropertyChanged (ad esempio, i ViewModel nelle applicazioni WPF e Silverlight costruite con pattern MVVM) possono avere la necessità di forzare l'aggiornamento di tutte le proprietà in un'unica soluzione.
Per far questo, e' sufficiente che scatenino l'evento PropertyChanged come di consueto, ma utilizzando String.Empty al posto del nome della proprietà nel costruttore di PropertyChangedEventArgs:

public class MyViewModel : INotifyPropertyChanged {

//...

public event PropertyChangedEventHandler PropertyChanged;

private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
private void Refresh()
{
NotifyPropertyChanged(string.Empty);
}

}

Come riconoscere una chiamata Ajax in ASP.NET

Scritto da Giorgio Di Nardo il 04 febbraio 2011
Linguaggio: C#   • Livello: 100 

Nonostante il nome molto incoraggiante, la proprietà IsAsync della classe Page non fornisce un aiuto in materia.

Il problema può invece essere risolto analizzando la collezione degli Headers della Request associata al HttpContext corrente.

L'header in questione è in particolare quello contrassegnato dalla chiave X-Requested-With che viene impostato a XMLHttpRequest nel caso di richieste Ajax.

In un normale Web Form (.aspx) che eredita da System.Web.UI.Page è quindi possibile utilizzare indifferentemente la sintassi:

protected void Page_Load(object sender, EventArgs e)
{
if (Request.Headers["X-Requested-With"] == "XMLHttpRequest")
{
[...]
}
}

o quella:

protected void Page_Load(object sender, EventArgs e)
{
if (HttpContext.Current.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
{
[...]
}
}

 

mentre in un Generic Handler (.ashx)  che eredita da IHttpHandler è possibile usare la sintassi:

public void ProcessRequest(HttpContext context)
{
if (context.Request.Headers["X-Requested-With"] == "XMLHttpRequest")
{
[...]
}
}

Aggiornare l'applicazione con Click-Once

Scritto da Massimo Bonanni il 31 gennaio 2011
Linguaggio: C#,VB   • Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

E' possibile aggiornare, programmaticamente, un'applicazione distribuita con Click-Once utilizzando il seguente pezzo di codice:

VB.NET

Dim appDep = ApplicationDeployment.CurrentDeployment
If appDep.Update() Then
' Aggiornamento effettuato con successo
Application.Restart() ' Riavvio l'applicazione
End If

 

C#

ApplicationDeployment appDep = ApplicationDeployment.CurrentDeployment;
if (appDep.Update()) { // Aggiornamenti diponibili
// Applicazione aggiornata correttamente
Application.Restart(); // Riavvio l'applicazione
}

 

Come ricavare i dpi dello schermo in WPF

Scritto da Massimo Bonanni il 28 gennaio 2011
Linguaggio: C#,VB   • Framework: 3.0,3.5,4.0   • Livello: 100 

Un modo per ricavare i dpi dello schermo è il seguente:

VB.NET

Public Shared Sub GetVideoResolution(ByRef xDpi As Double, ByRef yDpi As Double)
Try
Dim MainWnd = PresentationSource.FromVisual(Application.Current.MainWindow)
Dim transMatrix = MainWnd.CompositionTarget.TransformToDevice
xDpi = transMatrix.M11 * 96D
yDpi = transMatrix.M22 * 96D
Catch ex As Exception
Throw
End Try
End Sub

 

C#

public static void GetVideoResolution(ref double xDpi, ref double yDpi)
{
try
{
PresentationSource MainWnd = PresentationSource.FromVisual(Application.Current.MainWindow);
Matrix transMatrix = MainWnd.CompositionTarget.TransformToDevice;
xDpi = transMatrix.M11 * 96.0;
yDpi = transMatrix.M22 * 96.0;
}
catch (Exception)
{
throw;
}
}

 

Come passare da Http a Https tramite un attributo ed un modulo Http

Scritto da Alessandro Mostarda il 24 gennaio 2011
Linguaggio: C#,VB   • Framework: 3.0,3.5,4.0   • Livello: 200 

Spesso abbiamo necessità di avere una o più pagine del nostro web Site che utilizzano un certificato e, pertanto, che usano il protocollo HTTPS.
Per fare ciò ci sono vari modi, ed uno di questi è quello di marcare le pagine con un attributo che indica se la pagina deve utilizzare il protocollo HTTPS o meno.

Prima di tutto dobbiamo creare un attributo:

C#

public class TagHttp: Attribute
{
public bool IsHttps { get; set; }
}


VB.NET

Public Class TagHttp
Inherits Attribute
Public Property IsHttps As Boolean
End Class



Dopo di che creiamo un paio di pagine decorandole con l'attributo

C#

[TagHttp(IsHttps = true)]
public partial class PageHttps: Page
{
}

[TagHttp(IsHttps=false)]
public partial class PageHttp : Page
{
}


VB.NET

<TagHttp(IsHttps:=False)>
Public Class PageHttp
Inherits Page
End Class
<TagHttp(IsHttps:=True)>
Public Class PageHttps
Inherits Page
End Class



e per finire ecco il codice del modulo http per effettuare il test della pagina ed utilizzare il protocollo corretto

C#

public class ModuleHttp :
IHttpModule
{
public void Dispose()
{
//
}

public void Init(HttpApplication context)
{
context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute);
}

void context_PreRequestHandlerExecute(object sender, EventArgs e)
{
Page page = HttpContext.Current.CurrentHandler as Page;
if (page != null)
{
TagHttp tag = (TagHttp)page.GetType().GetCustomAttributes(typeof(TagHttp), true).First();
if (HttpContext.Current.Request.IsSecureConnection)
{
if (!tag.IsHttps)
{
HttpContext.Current.Response.RedirectPermanent(HttpContext.Current.Request.Url.AbsoluteUri.Replace("https://", "http://"), true);
}
}
else
{
if (tag.IsHttps)
{
HttpContext.Current.Response.RedirectPermanent(HttpContext.Current.Request.Url.AbsoluteUri.Replace("https://", "http://"), true);
}
}
}
}
}


VB.NET

Public Class ModuleHttp
Implements IHttpModule
Public Sub Dispose() Implements IHttpModule.Dispose
End Sub

Public Sub Init(ByVal context As HttpApplication) Implements IHttpModule.Init
AddHandler context.PreRequestHandlerExecute, AddressOf context_PreRequestHandlerExecute
End Sub

Private Sub context_PreRequestHandlerExecute(ByVal sender As Object, ByVal e As EventArgs)
Dim page As Page = TryCast(HttpContext.Current.CurrentHandler, Page)
If page IsNot Nothing Then
Dim tag As TagHttp = DirectCast(page.GetType().GetCustomAttributes(GetType(TagHttp),True).First(), TagHttp)
If HttpContext.Current.Request.IsSecureConnection Then
If Not tag.IsHttps Then
HttpContext.Current.Response.RedirectPermanent(HttpContext.Current.Request.Url.AbsoluteUri.Replace("https://", "http://"), True)
End If
Else
If tag.IsHttps Then
HttpContext.Current.Response.RedirectPermanent(HttpContext.Current.Request.Url.AbsoluteUri.Replace("http://", "http://"), True)
End If
End If
End If
End Sub
End Class



P.S. Ricordarsi di registrare il modulo all'interno del file web.config...

Cambiare la pagina di avvio di un'applicazione WP7

Scritto da Massimo Bonanni il 21 gennaio 2011
Linguaggio: C#,VB   • Framework: 4.0   • Livello: 100 

Quando creiamo una applicazione WP7 (sia in C# che in VB.NET) la pagina di startup della stessa è MainPage.xaml.
Per poter cambiare questa pagina di startup con un'altra è necessairio intervenire all'interno del file WMAppManifest.xml contenuto della cartella Properties e modificare il seguente tag xml:

<Tasks>
<DefaultTask Name="_default" NavigationPage="MainPage.xaml" />
</Tasks>

Centralizzare la gestione degli eventi da tastiera in una windows form

Scritto da Massimo Bonanni il 17 gennaio 2011
Linguaggio: C#,VB   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

A volte può essere utile centralizzare la gestione di un evento da tastiera, ad esempio la pressione di un tasto, a livello di form piuttosto che gestirlo in tutti i controlli in essa contenuti.
Per fare questo possiamo impostare la proprietà KeyPreview della form stessa con il valore True.
Quando viene premuto un tasto su un controllo all'interno di una form con KeyPreview=true, vengono generati gli eventi KeyUp, KeyPress e KeyDown prima a livello di Form e, poi, a livello del controllo con il focus.
In questo caso sarà, quindi sufficiente, gestire l'evento sulla form e garantirci che, qualunque controllo abbia il focus, venga gestito il tasto correttamente.

Come impostare un numero di righe indefinito in una jqGrid

Scritto da Giorgio Di Nardo il 14 gennaio 2011
Linguaggio: JS   • Livello: 100 

Nonostante le specifiche prevedessero fin dalla versione 3.5.1 la possibilità di mostrare tutte le righe in un'unica griglia senza paginazione (impostando il parametro rowNum con il valore -1) tale strada non è al momento supportata.

E' però possibile ottenere lo stesso effetto impostando un valore superiore al numero massimo di righe che ci aspettiamo di dover mostrare (ad esempio 100000).

$('#idMiaGriglia').jqGrid({
rowNum: 100000,
[...]
});

Come caricare una jqGrid con un array presente sul client

Scritto da Giorgio Di Nardo il 10 gennaio 2011
Linguaggio: JS   • Livello: 100 

Anche se la modalità più utilizzata per il caricamento dei dati in una jqGrid è quella della chiamata ad un servizio lato-server identificato per mezzo del parametro url, è possibile utilizzare una jqGrid anche per visualizzare dati già presenti lato-client in un array Javascript.

In tal caso è sufficiente tralasciare il parametro url e configurare opportunamente i parametri datatype e data.

In particolare è necessario impostare in datatype il valore 'local' e in data l'array contenente i dati:

$('#idMiaGriglia').jqGrid({
datatype: 'local',
data: mioArray,
[...]
});

Aprire il browser di Windows Phone 7 da codice

Scritto da Massimo Bonanni il 07 gennaio 2011
Linguaggio: C#,VB   • Framework: 4.0   • Livello: 100 

Se vogliamo, all'interno della nostra applicazione WP7, aprire il browser ad una specifica pagina possiamo utilizzare il seguente pezzo di codice:

VB.NET

Dim task = New WebBrowserTask()
task.URL = ""
task.Show()

 

C#

WebBrowserTask task = new WebBrowserTask();
task.URL = "";
task.Show();

 

All'esecuzione del metodo Show(), ovviamente, la nostra applicazione subisce il tombstoning.
Il namespace Microsoft.Phone.Tasks contiene tutti i principali task che si possono eseguire su WP7, come, ad esempio inviare una mail, scegliere un indirizzo di mail, inviare un sms e così via.

Cambiare il tema di una pagina ASPX

Scritto da Massimo Bonanni il 03 gennaio 2011

Per poter cambiare il tema di una pagina aspx possiamo impostare le proprietà seguenti:

VB.NET

Me.Theme = "MioTema"
Me.StyleSheetTheme = "MioTema"

 

C#

this.Theme = "MioTema";
this.StyleSheetTheme = "MioTema";

 

La modifica di queste ha buon fine,però, solo se la effettuiamo nell'evento PreInit della pagina.

Metodo di estensione per implementare Intersect

Scritto da Alessandro Mostarda il 31 dicembre 2010
Linguaggio: C#,VB   • Framework: 3.5,4.0   • Livello: 200 

Il seguente metodo di estensione implementa la funzione Intersect tra due liste con una funzione di confronto definita tramite lambda expression. Il metodo ritorna solo le istanze della collection a cui è applicato il metodo stesso.

Tale metodo può essere paragonato alla JOIN di LINQ, con l'unica differenza che non è possibile selezionare il tipo di ritorno.

C#

public static IEnumerable<T> Intersect<T,C>(this IEnumerable<T> source, IEnumerable<C> target, Func<T, C, bool> compareCriteria)
{
return source.Where(x => target.Any(y => compareCriteria(x, y)));
}

 

VB.NET

Imports System.Runtime.CompilerServices
Public Module Extension

<Extension()> _
Public Function Intersect(Of T, C)(ByVal source As IEnumerable(Of T), _
ByVal target As IEnumerable(Of C), _
ByVal compareCriteria As Func(Of T, C, Boolean)) As IEnumerable(Of T)
Return source.Where(Function(x) target.Any(Function(y) compareCriteria(x, y)))
End Function

End Module

 

La sintassi per utilizzarli è la seguente:

C#

public void Main()
{
List<Person> firstList = new List<Person>();
firstList.Add(new Person {Name = "Antonio",
Surname = "Verdi",
DateOfBirth = new System.DateTime(1975, 7, 22)
});
firstList.Add(new Person {Name = "Mario",
Surname = "Rossi",
DateOfBirth = new System.DateTime(1956, 3, 14)
});
firstList.Add(new Person {Name = "Giuseppe",
Surname = "Bianchi",
DateOfBirth = new System.DateTime(1985, 11, 25)
});

List<Person> secondList = new List<Person>();
secondList.Add(new Person {Name = "Mario",
Surname = "Verdi",
DateOfBirth = new System.DateTime(1975, 7, 22)
});
secondList.Add(new Person {Name = "Mario",
Surname = "Rossi",
DateOfBirth = new System.DateTime(1989, 2, 4)
});
secondList.Add(new Person {Name = "Giuseppe",
Surname = "Verdi",
DateOfBirth = new System.DateTime(1985, 11, 14)
});

var matchBySurname = firstList.Intersect(secondList, (x, y) => x.Surname == y.Surname);
var matchByName = firstList.Intersect(secondList, (x, y) => x.Name == y.Name);
var matchByNameAndSurname = firstList.Intersect(secondList, (x, y) => x.Name == y.Name && x.Surname == y.Surname);
var matchByYear = firstList.Intersect(secondList, (x, y) => x.DateOfBirth.Year == y.DateOfBirth.Year);
}

public class Person
{
public string Name { get; set; }
public string Surname { get; set; }
public DateTime DateOfBirth { get; set; }
}

 

VB.NET

Sub Main()
Dim firstList As New List(Of Person)
firstList.Add(New Person With {.Name = "Antonio", _
.Surname = "Verdi", _
.DateOfBirth = New Date(1975, 7, 22)})
firstList.Add(New Person With {.Name = "Mario", _
.Surname = "Rossi", _
.DateOfBirth = New Date(1956, 3, 14)})
firstList.Add(New Person With {.Name = "Giuseppe", _
.Surname = "Bianchi", _
.DateOfBirth = New Date(1985, 11, 25)})

Dim secondList As New List(Of Person)
secondList.Add(New Person With {.Name = "Mario", _
.Surname = "Verdi", _
.DateOfBirth = New Date(1975, 7, 22)})
secondList.Add(New Person With {.Name = "Mario", _
.Surname = "Rossi", _
.DateOfBirth = New Date(1989, 2, 4)})
secondList.Add(New Person With {.Name = "Giuseppe", _
.Surname = "Verdi", _
.DateOfBirth = New Date(1985, 11, 14)})

Dim matchBySurname = firstList.Intersect(secondList, Function(x, y) x.Surname = y.Surname)
Dim matchByName = firstList.Intersect(secondList, Function(x, y) x.Name = y.Name)
Dim matchByNameAndSurname = firstList.Intersect(secondList, Function(x, y) x.Name = y.Name AndAlso x.Surname = y.Surname)
Dim matchByYear = firstList.Intersect(secondList, Function(x, y) x.DateOfBirth.Year = y.DateOfBirth.Year)

End Sub

Public Class Person
Public Property Name As String
Public Property Surname As String
Public Property DateOfBirth As DateTime
End Class

Come caricare una jqGrid con dati XML presenti sul client

Scritto da Giorgio Di Nardo il 27 dicembre 2010 (aggiornato il 28 dicembre 2010)
Linguaggio: JS   • Livello: 100 

Anche se la modalità più utilizzata per il caricamento dei dati in una jqGrid è quella della chiamata ad un servizio lato-server identificato per mezzo del parametro url, è possibile utilizzare una jqGrid anche per visualizzare dati già presenti lato-client in formato XML.

In tal caso è sufficiente tralasciare il parametro url e configurare opportunamente i parametri datatype e datastr, utilizzando se necessario il metodo addXmlData.

In particolare, nel caso di dati memorizzati come stringa XML, è necessario impostare in datatype il valore 'xmlstring' e in datastr la stringa contenente i dati:

$('#idMiaGriglia').jqGrid({
datatype: 'xmlstring',
datastr: miaStringaXML,
[...]
});

 

Nel caso invece di dati memorizzati come oggetto XML (provenienti da una precedente chiamata ad un servizio lato-server o generati con altre modalità lato-client), è necessario impostate in datatype il valore 'xml' ed effettuare una chiamata al metodo addXmlData usando come parametro l'oggetto contenente i dati:

$('#idMiaGriglia').jqGrid({
datatype: 'xml',
[...]
});

$('#idMiaGriglia')[0].addXmlData(mioOggettoXML);

Cambiare la lingua di una pagina ASPX

Scritto da Massimo Bonanni il 24 dicembre 2010
Linguaggio: C#,VB   • Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

Per poter cambiare la lingua di una pagina aspx è sufficiente impostare opportunamente le due proprietà:

    System.Threading.Thread.CurrentThread.CurrentCulture
    System.Threading.Thread.CurrentThread.CurrentUICulture

impostando l'oggetto CultureInfo della lingua desiderata:

VB.NET

System.Threading.Thread.CurrentThread.CurrentCulture = New CultureInfo("it-IT")
System.Threading.Thread.CurrentThread.CurrentUICulture= New CultureInfo("it-IT")

 

C#

System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("it-IT");
System.Threading.Thread.CurrentThread.CurrentUICulture= new CultureInfo("it-IT");

 

La modifica di queste ha buon fine solo se la effettuiamo nell'override del metodo protetto InitializeCulture della pagina.

Metodo di estensione per implementare l'Except

Scritto da Alessandro Mostarda il 20 dicembre 2010

Il seguente metodo di estensione implementa la funzione Except tra due liste con una funzione di confronto definita tramite lambda expression.

La funzione restituisce la differenza insiemistica tra due liste, ovvero permette di ottenere una lista di oggetti contenuti nella prima ma non nella seconda.

C#

public static IEnumerable<T> Except<T,C>(this IEnumerable<T> source,
IEnumerable<C> target,
Func<T, C, bool> compareCriteria)
{
return source.Where(x => !target.Any(y => compareCriteria(x, y)));
}

 

VB.NET

Imports System.Runtime.CompilerServices
Public Module Extension

<Extension()> _
Public Function Except(Of T, C)(ByVal source As IEnumerable(Of T), _
ByVal target As IEnumerable(Of C), _
ByVal compareCriteria As Func(Of T, C, Boolean)) As IEnumerable(Of T)
Return source.Where(Function(x) Not target.Any(Function(y) compareCriteria(x, y)))
End Function

End Module

 

Un esempio di utilizzo è il seguente:

C#

public void Main()
{
List<Person> firstList = new List<Person>();
firstList.Add(new Person {
Name = "Antonio",
Surname = "Verdi",
DateOfBirth = new System.DateTime(1975, 7, 22)
});
firstList.Add(new Person {
Name = "Mario",
Surname = "Rossi",
DateOfBirth = new System.DateTime(1956, 3, 14)
});
firstList.Add(new Person {
Name = "Giuseppe",
Surname = "Bianchi",
DateOfBirth = new System.DateTime(1985, 11, 25)
});

List<Person> secondList = new List<Person>();
secondList.Add(new Person {
Name = "Mario",
Surname = "Verdi",
DateOfBirth = new System.DateTime(1975, 7, 22)
});
secondList.Add(new Person {
Name = "Mario",
Surname = "Rossi",
DateOfBirth = new System.DateTime(1989, 2, 4)
});
secondList.Add(new Person {
Name = "Giuseppe",
Surname = "Verdi",
DateOfBirth = new System.DateTime(1985, 11, 14)
});

var mismatchBySurname = firstList.Except(secondList, (x, y) => x.Surname == y.Surname);
var mismatchByName = firstList.Except(secondList, (x, y) => x.Name == y.Name);
var mismatchByNameAndSurname = firstList.Except(secondList, (x, y) => x.Name == y.Name && x.Surname == y.Surname);
var mismatchByYear = firstList.Except(secondList, (x, y) => x.DateOfBirth.Year == y.DateOfBirth.Year);
}

public class Person
{
public string Name { get; set; }
public string Surname { get; set; }
public DateTime DateOfBirth { get; set; }
}

 

VB.NET

Sub Main()
Dim firstList As New List(Of Person)
firstList.Add(New Person With {.Name = "Antonio", .Surname = "Verdi", .DateOfBirth = New Date(1975, 7, 22)})
firstList.Add(New Person With {.Name = "Mario", .Surname = "Rossi", .DateOfBirth = New Date(1956, 3, 14)})
firstList.Add(New Person With {.Name = "Giuseppe", .Surname = "Bianchi", .DateOfBirth = New Date(1985, 11, 25)})

Dim secondList As New List(Of Person)
secondList.Add(New Person With {.Name = "Mario", .Surname = "Verdi", .DateOfBirth = New Date(1975, 7, 22)})
secondList.Add(New Person With {.Name = "Mario", .Surname = "Rossi", .DateOfBirth = New Date(1989, 2, 4)})
secondList.Add(New Person With {.Name = "Giuseppe", .Surname = "Verdi", .DateOfBirth = New Date(1985, 11, 14)})

Dim mismatchBySurname = firstList.Except(secondList, Function(x, y) x.Surname = y.Surname)
Dim mismatchByName = firstList.Except(secondList, Function(x, y) x.Name = y.Name)
Dim mismatchByNameAndSurname = firstList.Except(secondList, Function(x, y) x.Name = y.Name AndAlso x.Surname = y.Surname)
Dim mismatchByYear = firstList.Except(secondList, Function(x, y) x.DateOfBirth.Year = y.DateOfBirth.Year)
End Sub

Public Class Person
Public Property Name As String
Public Property Surname As String
Public Property DateOfBirth As DateTime
End Class

Come caricare una jqGrid con dati JSON presenti sul client

Scritto da Giorgio Di Nardo il 17 dicembre 2010
Linguaggio: JS   • Livello: 100 

Anche se la modalità più utilizzata per il caricamento dei dati in una jqGrid è quella della chiamata ad un servizio lato-server identificato per mezzo del parametro url, è possibile utilizzare una jqGrid anche per visualizzare dati già presenti lato-client in formato JSON.

In tal caso è sufficiente tralasciare il parametro url e configurare opportunamente i parametri datatype e datastr, utilizzando se necessario il metodo addJSONData.

In particolare, nel caso di dati memorizzati come stringa JSON, è necessario impostare in datatype il valore 'jsonstring' e in datastr la stringa contenente i dati:

$('#idMiaGriglia').jqGrid({
datatype: 'jsonstring',
datastr: miaStringaJSON,
[...]
});

 

Nel caso invece di dati memorizzati come oggetto JSON (provenienti da una precedente chiamata ad un servizio lato-server o generati con altre modalità lato-client), è necessario impostate in datatype il valore 'json' ed effettuare una chiamata al metodo addJSONData usando come parametro l'oggetto contenente i dati:

$('#idMiaGriglia').jqGrid({
datatype: 'json',
[...]
});

$('#idMiaGriglia')[0].addJSONData(mioOggettoJSON);

Ricostruire la cache dei template di Visual Studio

Scritto da Nicolò Carandini il 13 dicembre 2010
Framework: 3.0,3.5,4.0   • Livello: 100 

Se abbiamo modificato o scaricato da internet un template di Visual Studio e non appare nella finestra di creazione nuovo item, è necessario ricostruire la cache dei template.

Per farlo occorre chiudere ogni istanza di Visual Studio, aprire il Visual Studio Command prompt come Amministratore (Start | All Programs | Microsoft Visual Studio | Visual Studio Tools | Visual Studio Command Prompt) ed eseguire il comando devenv /installvstemplates.

Maggiori informazioni sulla modifica dei template possono essere trovate al seguente indirizzo: http://blogs.ugidotnet.org/Nick60/archive/2010/11/23/modificare-gli-item-template-di-visual-studio-2010.aspx

.

Costruire lo schema data URI di un'immagine

Scritto da Massimo Bonanni il 10 dicembre 2010
Linguaggio: C#,VB   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

Lo schema data URI consente di incorporare risorse all'interno delle pagine web senza referenziarle tramite il classico URL.
Lo schema data URI si basa sull'encoding base64 e il codice per ottenerlo a partire da un'immagine è il seguente:

VB.NET

Public Function CreateDataUri(ByVal image As System.Drawing.Image) As String
Dim base64String As String
Using ms As New IO.MemoryStream
image.Save(ms, image.RawFormat)
base64String = Convert.ToBase64String(ms.ToArray())
End Using
Return String.Format("data:image/png;base64,{0}", base64String)
End Function

 

C#

public string CreateDataUri(System.Drawing.Image image)
{
string base64String;
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
image.Save(ms, image.RawFormat);
base64String = Convert.ToBase64String(ms.ToArray());
}
return String.Format("data:image/png;base64,{0}", base64String);
}

Creare un HttpHandler per caricare immagini

Scritto da Alessandro Mostarda il 06 dicembre 2010
Linguaggio: C#   • Framework: 2.0,3.0,3.5,4.0   • Livello: 200 

Questo esempio mostra come creare un HttpHandler che consente di caricare delle immagini da una directory non situtata all'interno del sito.

Per prima cosa occorre creare una classe che implementi l'interfaccia IHttpHandler:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Configuration;
using System.Drawing;
using System.Drawing.Imaging;

namespace DomusHttpHandlerExample
{
public class HttpImageHandler:IHttpHandler
{
#region IHttpHandler Members

public bool IsReusable
{
get { return true; }
}

public void ProcessRequest(HttpContext context)
{
string fileName = ConfigurationManager.AppSettings["ImageDir"] + context.Request.QueryString["file"];

using (var img = new Bitmap(fileName))
{
context.Response.ContentType = "image/jpeg";
context.Response.BufferOutput = false;
img.Save(context.Response.OutputStream, ImageFormat.Jpeg);
context.Response.End();
}
}

#endregion
}
}

 

Dopo di che dobbiamo registrare l'HttpHandler nel web.config:

<httpHandlers>
<add verb="*" path="*.img" type="DomusHttpHandlerExample.HttpImageHandler"/>
</httpHandlers>

 

P.S. il tag HttpHandler si trova sotto il nodo System.Web

Per far funzionare il tutto dobbiamo anche registare l'estensione *.Img(parametro presente nel valore Path del file di configurazione) all'interno di IIS. Quindi andare sotto la voce "Mapping gestori" o "Handler Mappings" del sito su IIS ed aggiungere tale voce.

Per testare l'handler, occorre creare un tag IMG,all'interno della nostra pagina, con il seguente valore nell'attributo src: 

<img src="HttpImageHandler.img?file=prova.jpg" alt="Test image" />

Enumerare risorse e contenuti inclusi all’interno di un’applicazione Windows Phone 7

Scritto da Marco Amendola il 03 dicembre 2010
Linguaggio: C#   • Framework: 4.0   • Livello: 100 

All'interno di un applicazione WP7 le risorse aggiuntive (ad es. immagini o suoni) possono essere incluse con due modalità di compilazione: Resource e Content.
La prima include gli elementi all'interno dell'assembly dell'applicazione (il quale a sua volta è contenuto all'interno del pacchetto Xap, che è in sostanza uno Zip), mentre la seconda inserisce gli elementi nello Xap, a fianco del'assembly principale e delle eventuali librerie referenziate nel progetto.

La seconda modalità è da preferire in quanto riduce la dimensione dell'assembly, migliorando il tempo di caricamento. Inoltre alcuni controlli (ad es. l'Application Bar) richiedono che le relative icone siano compilate come Content.

Per gli elementi compilati come "Resource", l'URI da utilizzare per la lettura è nella forma: /My.Assembly;component/Path/To/ImageFile.ext
Se invece gli elementi inclusi sono compilati come "Content", gli URI relativi sono nella forma: /Path/To/ImageFile.ext

Mentre l'accesso diretto ai singoli elementi è piuttosto semplice, conoscendone il nome e il path, l'enumerazione non lo è altrettanto.

Per enumerare gli elementi Resource è possibile utilizzare la classe ResourceManager; di seguito un esempio:

IEnumerable<Uri> GetAllImageUrisInternal()
{
var assembly = Assembly.GetExecutingAssembly();
var assemblyName = assembly.FullName;
assemblyName = assemblyName.Remove(assemblyName.IndexOf(","));
ResourceManager rm = new ResourceManager(assemblyName + ".g", assembly);

//HACK: senza questo primo accesso l'enumerazione sembra fallire
using (Stream stm = rm.GetStream("app.xaml")) { }

var entries = new DictionaryEntry[]{};
using (ResourceSet rs = rm.GetResourceSet(Thread.CurrentThread.CurrentUICulture, false, true)) {
entries = rs.Cast<DictionaryEntry>().ToArray();
}

foreach (var entry in entries)
{
var key = entry.Key.ToString();
if (key.StartsWith("resources/images/")) //qui è possibile filtrare le risorse di interesse in base al nome e al path
yield return new Uri(string.Format("/{0};component/{1}", assemblyName, key),UriKind.RelativeOrAbsolute);
}
}

 

Per enumerare gli elementi inclusi come Content, invece, non conosco una soluzione che consenta di ispezionare il pacchetto Xap direttamente dall'applicazione.

E' però possibile includere nello Xap un file di testo contenente un elenco degli elementi inclusi (una sorta di indice).
Accedendo a questo file, che deve avere ovviamente un nome noto, è possibile ricostruire l'elenco dei Content.
Per non dover manutenere manualmente l'elenco è possibile aggiungere nel file di progetto .csprj (che descrive il processo di build) un piccolo task MSBuild che scrive l'elenco dei "Content" in un file di testo:

<Target Name="BeforeBuild">
<WriteLinesToFile File="Resources\ContentList.txt" Lines="@(Content)" Overwrite="true" Encoding="Unicode"/>
</Target>

 

Questo "step" sarà eseguito automaticamente prima di ogni compilazione, in modo che l'elenco sia sempre allineato ai contenuti correnti del progetto.

Copiare il contenuto di uno stream in un altro

Scritto da Luca Cestola il 29 novembre 2010
Linguaggio: C#,VB   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

Con il framework 4.0 è stato introdotto il metodo CopyTo della classe Stream che copia il contenuto di uno stream su un altro. Con i framework precedenti possiamo utilizzare un codice di questo tipo:

C#

public static void CopyToStream(Stream input, Stream output)
{
byte[] buffer = new byte[4096];
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, read);
}
}

 

VB.Net

Public Sub CopyToStream(ByVal input As Stream, ByVal output As Stream)
Dim buffer(4095) As Byte
Dim read As Integer = input.Read(buffer, 0, buffer.Length)
Do While (read > 0)
output.Write(buffer, 0, read)
read = input.Read(buffer, 0, buffer.Length)
Loop
End Sub

Ordinare il contenuto di una lista

Scritto da Massimiliano Bellisario il 26 novembre 2010
Linguaggio: C#   • Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

Per ordinare il contenuto di un istanza di classe List<T> si può utilizzare il metodo Sort():

C#

 

List<string> nomi= new List<string>();
nomi.Add("Massimiliano");
nomi.Add("Massimo");
nomi.Add("Tony");
nomi.Add("Nick");
nomi.Add("Marco");
nomi.Add("Pietro");
nomi.Add("Alessandro");
nomi.Sort(delegate(string A, string B) {
return A.CompareTo(B);
});

Ottenere lo XAML di un elemento di un'interfaccia WPF a runtime

Scritto da Massimo Bonanni il 22 novembre 2010
Linguaggio: C#,VB   • Framework: 3.0,3.5,4.0   • Livello: 100 

Se la variabile uiObj contiene un elemento della nostra interfaccia WPF (ad esempio un Button), possiamo recuperare lo XAML che lo descrive nel seguente modo:

VB.NET

Dim objXaml = XamlWriter.Save(uiObj)

 

C#

String objXaml = XamlWriter.Save(uiObj);

 

Utilizzare la reflection per caricare dei plugin

Scritto da Daniele Rongione il 19 novembre 2010
Linguaggio: C#,VB   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

Tramite il namespace System.Reflection è possibile caricare degli assembly a runtime e istanziarne le classi potendo, quindi, creare un sistema di plugin per la nostra applicazione.
Gli assembly da usare come plugin dovranno contenere l'implementazione delle interfacce definite nell'applicazione. Per caricare il plugin e istanziarne la classe corretta si può usare questo codice:

C#

string assemblyName = "DomusDotNet.Esempi.Reflection, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null";
string interfaccia = "IEsempio";
object istanza = null;
// Carico l'assembly
System.Reflection.Assembly assembly = System.Reflection.Assembly.Load(assemblyName);
// Cerco in ogni tipo all'interno dell'assembly
foreach (Type type in assembly.GetTypes())
{
// Se il tipo è pubblico e non è astratto
if ((type.IsPublic) &&
!((type.Attributes & System.Reflection.TypeAttributes.Abstract) == System.Reflection.TypeAttributes.Abstract))
{
// Controllo che il tipo implementi l'interfaccia
Type implementazione = type.GetInterface(interfaccia, true);
if (implementazione != null)
{
// Istanzio la classe
istanza = assembly.CreateInstance(type.FullName);
}
}
}

 

VB.NET

Dim assemblyName As String = "DomusDotNet.Esempi.Reflection, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
Dim interfaccia As String = "IEsempio"
Dim istanza As Object = Nothing

' Carico l'assembly
Dim assembly As System.Reflection.Assembly = System.Reflection.Assembly.Load(assemblyName)
' Cerco in ogni tipo all'interno dell'assembly
For Each type As Type In assembly.GetTypes()
' Se il tipo è pubblico e non è astratto
If (type.IsPublic) AndAlso Not ((type.Attributes And System.Reflection.TypeAttributes.Abstract) = System.Reflection.TypeAttributes.Abstract) Then
' Controllo che il tipo implementi l'interfaccia
Dim implementazione As Type = type.GetInterface(interfaccia, True)
If implementazione IsNot Nothing Then
' Istanzio la classe
istanza = assembly.CreateInstance(type.FullName)
End If
End If
Next

Event Handler Shortcut e Lambda Expression

Scritto da Antonio Pierascenzi il 15 novembre 2010
Linguaggio: C#   • Framework: 3.5,4.0   • Livello: 100 

Lo shortcut presente in Visual Studio che facilita la generazione di un event handler da associare ad un evento è molto comodo, ma se volessimo utilizzare la funzionalità che ci offre il framework con le lambda expression potremmo scrivere, in Windows Form:

Prima:

this.Closing += new System.ComponentModel.CancelEventHandler(FrmMain_Closing);
……
void FrmMain_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
MessageBox.Show("Welcome Lambda!");
}


Dopo:
Closing += FrmMain_Closing;


Che, attraverso le lambda come dicevamo, potrebbe diventare:

Closing += (sender,e)=>MessageBox.Show("Welcome Lambda"); 


Come vediamo il framework, attraverso l'inferenza dei delegate, ci supporta attribuendo automaticamente l'opportuno gestore dell'evento (ricordiamoci che il framework ci mette a disposizione molti delegate tutti derivati dalla classe EventHandler).

Creare un Http Module per la gestione degli errori

Scritto da Alessandro Mostarda il 12 novembre 2010
Linguaggio: C#,VB   • Framework: 2.0,3.0,3.5,4.0   • Livello: 200 

Nell'esempio viene mostrato come creare un HttpModule per la gestione degli errori non gestiti nel codice.

VB.NET

Namespace DomusHttpModuleExample

Public Class HttpErrorModule
Implements IHttpModule
Public Sub Dispose()
'Nessuna implementazione
End Sub
Public Sub Init(context As HttpApplication)
AddHandler context.Error, Addressof context_Error
End Sub
Private Sub context_Error(sender As Object, e As EventArgs)
'Inserire qui la logica di gestione dell'errore, come ad esempio inviare l'errore per e-mail,
o salvare su file di testo o database.
End Sub
End Class
End Namespace

 

C#

namespace DomusHttpModuleExample
{
public class HttpErrorModule : IHttpModule
{
public void Dispose()
{
//Nessuna implementazione
}
public void Init(HttpApplication context)
{
context.Error += new EventHandler(context_Error);
}
private void context_Error(object sender, EventArgs e)
{
//Inserire qui la logica di gestione dell'errore, come ad esempio inviare l'errore per e-mail, o salvare su file di testo o database.
}
}
}

 

Per far funzionare il tutto dobbiamo, però, mettere mano anche al file di configurazione ed aggiungere il seguente codice sotto il tag <system.web>

<httpModules>
<add name="ErrorModule" type="DomusHtpModuleExample.HttpErrorModule, App_Code">
</httpModules>


Recuperare le proprietà di una classe ed il loro valore

Scritto da Massimiliano Bellisario il 08 novembre 2010
Linguaggio: C#,VB   • Framework: 3.0,3.5,4.0   • Livello: 200 

In questo esempio viene descritto il codice per recuperare le proprietà di una classe ed il loro valore.

C#

public class Persona
{
public string Nome{ get; set; }
public string Cognome{ get; set; }

public Persona() {}
}

public void Test()
{
var persona=new Persona
{
Nome="Massimiliano", Cognome="Bellisario"
};
var type = typeof(Persona);
var properties = type.GetProperties();

foreach (PropertyInfo property in properties)
{
Console.Writeln("{0} : {1}", property.Name, property.GetValue(persona, null));
}
}

 

VB.NET

Public Class Persona
Public Property Nome() As String
Get
Return m_Nome
End Get
Set
m_Nome = Value
End Set
End Property
Private m_Nome As String

Public Property Cognome() As String
Get
Return m_Cognome
End Get
Set
m_Cognome = Value
End Set
End Property
Private m_Cognome As String

Public Sub New()
End Sub
End Class

Public Sub Test()
Dim persona = New Persona() With { _
.Nome = "Massimiliano", _
.Cognome = "Bellisario" _
}

Dim type = GetType(Persona)
Dim properties = type.GetProperties()

For Each [property] As PropertyInfo In properties
Console.Writeln("{0} : {1}", [property].Name, [property].GetValue(persona, Nothing))
Next
End Sub

 

Il codice non riesce a recuperare le proprietà indicizzate.

Recuperare il livello di rendering della scheda video con WPF

Scritto da Massimo Bonanni il 05 novembre 2010
Linguaggio: C#,VB   • Framework: 3.5,4.0   • Livello: 100 

Possiamo recuperare il livello di rendering della scheda video utilizzando il seguente codice:

VB.NET

Dim renderTier = RenderCapability.Tier >> 16
Select Case renderTier
Case 0
' DirectX 7
Case 1
' DirectX >7 e <=9
Case 2
' DirectX >9
End Select

 

C#

var renderTier = RenderCapability.Tier >> 16;
switch (renderTier)
{
case 0:
// DirectX 7
break;
case 1:
// DirectX >7 e <=9
break;
case 2:
// DirectX >9
break;
}

Come usare i bitfield

Scritto da Daniele Rongione il 01 novembre 2010
Linguaggio: C#,VB   • Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

Un bitfield è il modo più compatto per memorizzare una serie di flag utilizzando una sola variabile. Il numero di flag impostabili dipende dalla dimensione in bit del tipo della variabile.

I flag possono essere dichiarati in un enum a cui va associato l'attributo Flags.

C#

// Dichiarazione dei flag.
// Per semplicità di lettura viene utilizzato l'operatore
// di bit shifting che sposta a sinistra il bit di n posizioni.
[Flags]
enum myFlags
{
Nessuno = 0,
Primo = (1 << 0), // = 00000000 00000001 = 1
Secondo = (1 << 1), // = 00000000 00000010 = 2
Terzo = (1 << 2), // = 00000000 00000100 = 4
Quarto = (1 << 3) // = 00000000 00001000 = 8
}
// Dichiarazione del bitfield.
// Il tipo short può contenere fino a 16 flag.
short bitfield = 0; // = 00000000 00000000
// Impostazione di un flag.
bitfield |= (short)myFlags.Secondo; // = 00000000 00000010
// Impostazione di più flag contemporaneamente.
bitfield |=(short)(myFlags.Primo | myFlags.Quarto); // = 00000000 00001011
// Controllo dello stato di un flag.
boolisFlaggedTerzo = ((bitfield & (int)myFlags.Terzo) != 0); // = false
boolisFlaggedQuarto = ((bitfield & (int)myFlags.Quarto) != 0); // = true
// Reset del quarto flag.
bitfield &= (short) ~myFlags.Quarto; // = 00000000 0000011

VB

' Dichiarazione dei flag.
' Per semplicità di lettura viene utilizzato l'operatore
' di bit shifting che sposta a sinistra il bit di n posizioni.
<Flags> _ Enum myFlags Nessuno = 0, Primo = (1 << 0), ' = 00000000 00000001 = 1 Secondo = (1 << 1), ' = 00000000 00000010 = 2 Terzo = (1 << 2), ' = 00000000 00000100 = 4 Quarto = (1 << 3) ' = 00000000 00001000 = 8 End Enum
' Dichiarazione del bitfield. ' Il tipo short può contenere fino a 16 flag. Dim bitfield As Short = 0 ' = 00000000 00000000 ' Impostazione di un flag. bitfield = bitfield Or myFlags.Secondo ' = 00000000 00000010 ' Impostazione di più flag contemporaneamente. bitfield = bitfield Or myFlags.Primo Or myFlags.Quarto ' = 00000000 00001011 ' Controllo dello stato di un flag. Dim isFlagged2 As Boolean = ((bitfield And myFlags.Terzo) <> 0) ' = false Dim isFlagged3 As Boolean = ((bitfield And myFlags.Quarto) <> 0) ' = true ' Reset del quarto flag. bitfield = bitfield And Not myFlags.Quarto ' = 00000000 0000011

How to: Overloading degli operatori

Scritto da Antonio Pierascenzi il 29 ottobre 2010
Linguaggio: C#   • Framework: 2.0,3.0,3.5,4.0 

A volte si ha la necessità di ridefinire i comportamenti di una determinata operazione che il framework ci fornisce nativamente per le nostre classi, pensiamo ad esempio al metodo ToString()  che applicato a tutte le classi che costruiamo ci restituisce, se richiamato, la stringa contenente il nome del tipo creato.
Inoltre si potrebbe avere bisogno di sommare quantità, moltiplicarle, applicare comparazioni logiche, insomma cose che solitamente si hanno spesso a disposizione nativamente per gli oggetti definiti nel framework ma non a disposizione nei nostri oggetti, se non definendo noi metodi adatti allo scopo.
Un modo più elegante di ottenere lo scopo è tramite l'overloading degli operatori, funzionalità messa a disposizione degli sviluppatori C# fin dalla prima versione del framework.Come sempre un esempio è meglio di tante parole.
Supponiamo di avere una classe Position così definita:

public class Position
{
public double X, Y, Z;

public Position(double x, double y, double z)
{
X = x;
Y = y;
Z = z;
}
public Position(Position xyz)
{
X = xyz.X;
Y = xyz.Y;
Z = xyz.Z;
}

public override string ToString()
{
return "Valore x:" + X + "\n Valore y:" + Y + "\n Valore z:" + Z;
}

public static Position operator +(Position xyz, Position abc)
{
var newPosition = new Position(xyz);
newPosition.X += abc.X;
newPosition.Y += abc.Y;
newPosition.Z += abc.Z;
return newPosition;
}
}

 

Come si può vedere la sintassi dell'overloading degli operatori è simile alla definizione di un metodo pubblico statico con l'aggiunta della sola keyword "operator" che comunica al compilatore che si sta definendo l'overload  per un operatore, in questo caso "+".

Utilizzo:

Position pos1, pos2, pos3;
pos1 = new Position(3.0,4.0,5.0);
pos2 = new Position(2.0, 1.5, 2.5);
pos3 = pos1 + pos2;

Console.WriteLine("Position 1:\n" + pos1.ToString());
Console.WriteLine("Position 2:\n" + pos2.ToString());
Console.WriteLine("Position 3:\n" + pos3.ToString());

 

Come sempre per maggiori dettagli su quali operatori è possibile effettuare l'overload riferirsi alla  documentazione su MSDN.

Generare l'event handler in automatico con Visual Studio.

Scritto da Nicolò Carandini il 25 ottobre 2010
Linguaggio: C#   • Framework: 3.5,4.0   • Livello: 100 

Visual Studio permette di definire un gestore di evento e agganciarlo ad un evento in un colpo solo senza scrivere il tutto a manina

Per eseguire questa operazione, basta premere due volte il tasto Tab dopo aver digitato += nella sottoscrizione evento.
Ad esempio, in WP7 Silverlight, per generare il default event handler dell'evento Loaded basta digitare

this.Loaded += {tab}{tab}

per ottenere:

this.Loaded += new RoutedEventHandler(Default_Loaded);
...
void Default_Loaded(object sender, RoutedEventArgs e)
{
throw new NotImplementedException();
}

Riconoscere se il percorso è una directory

Scritto da Massimiliano Bellisario il 22 ottobre 2010
Linguaggio: C#,VB   • Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

Ritorna true se il path passato alla funzione è una directory.

C#

public bool IsFolder(string path)
{
return ((File.GetAttributes(path) & FileAttributes.Directory) == FileAttributes.Directory);
}

 

VB.NET

Public Function IsFolder(ByVal path As String) As Boolean
Return ((File.GetAttributes(path) And FileAttributes.Directory) = FileAttributes.Directory)
End Function

Contare le occorrenze dei caratteri in una stringa usando LINQ

Scritto da Massimo Bonanni il 18 ottobre 2010
Linguaggio: C#,VB   • Framework: 3.5,4.0   • Livello: 100 

La seguente istruzione consente di creare un array formato da coppie (char, integer) contenente il conteggio delle
occorrenze dei caratteri contenuti in una stringa:

VB.NET

Dim query = From c In stringa.ToCharArray() _
Group By c Into grouping = Group _
Order By c _
Select New With {.Char = c, .Count = grouping.Count()}

 

C#

var query = from c in stringa.ToCharArray()
group c by c into grouping
orderby grouping.Key
select new { Char = grouping.Key, Count = grouping.Count() };

 

dove la variabile stringa contiene la stringa di cui calcolare le occorrenze.

Disabilitare l'autoconnessione nel Team Explorer

Scritto da Matteo Emili il 15 ottobre 2010

Per chi utilizza molti Team Foundation Server differenti, ed in luoghi geograficamente differenti, può essere comodo eliminare la feature che prevede l'autoconnessione all'ultima istanza di Team Foundation Server utilizzata (che potrebbe risultare offline, rallentare l'IDE in start-up e generare errore TF30331).
Basta aggiungere, nel Registry al percorso

HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\<versione>\TeamFoundation

la chiave AutoLoadServer, con valore 0 (DWORD).

Legenda <versione>:
8.0 = Visual Studio 2005
9.0 = Visual Studio 2008
10.0 = Visual Studio 2010

Cancellare il contenuto di un DIV tramite JQuery

Scritto da Alessandro Mostarda il 11 ottobre 2010
Linguaggio: JS   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

Se vogliamo svuotare il contenuto di un DIV, Jquery mette a disposizione la seguente istruzione:

$("#IDDiv").attr();

Come capire se un numero è pari o dispari

Scritto da Giorgio Di Nardo il 08 ottobre 2010
Linguaggio: C#,VB   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

Per capire se un numero è pari o dispari, è sufficiente esaminare il valore risultato dell'operazione

C#

Int32 mod=numero % 2;

 

VB.NET

Dim [mod] = 7 Mod 2

 

se mod è uguale a 0 il numero è pari, se è 1 il numero è dispari

Come rimappare un tag ASPX in una nostra classe

Scritto da Massimo Bonanni il 04 ottobre 2010
Linguaggio: C#,VB   • Framework: 2.0,3.0,3.5,4.0   • Livello: 200 

ASP.NET ci consente di ri-mappare i controlli del framework su nostre classi.
Supponiamo di aver creato una nostra classe MyLabel il cui comportamento dovrà sostituire la normale Label messa a disposizione dal framework.
Per poter fare in modo che ovunque compare il controllo <asp:Label>, in realtà venga istanziato ed utilizzato il nostro controllo  ci basta inserire la seguente riga all'interno del web.config:

<pages>
.
.
<tagMapping>
<add tagType="System.Web.UI.WebControls.Label" mappedTagType="MyLabel" />
</tagMapping>
.
.
</pages>

Creare un 'RadioListBox' in WPF

Scritto da Marco Amendola il 01 ottobre 2010
Framework: 3.5,4.0   • Livello: 200 

A molti sarà capitato di aver bisogno di usare un insieme coordinato di RadioButton all'interno di un'applicazione. Per rendere un insieme di RadioButton mutuamente esclusivi, è sufficiente impostare la proprietà "GroupName":

<RadioButton GroupName="myGroupName">a</RadioButton>
<RadioButton GroupName="myGroupName">c</RadioButton>
<RadioButton GroupName="myGroupName">b</RadioButton>

Questo consente di creare diversi gruppi coordinati in maniera flessibile. Tuttavia, trattandosi di controlli isolati, è complicato determinare l'elemento selezionato: occorre assegnare un nome a ciascun RadioButton e testare la proprietà IsChecked per ciascuno di essi.
Ancora più complicato utilizzare il valore selezionato oppure caricare i valori disponibili attraverso il Data Binding, cosa indispensabile in molte applicazioni "Line of Business".

Quello di cui abbiamo bisogno per questi scenari è qualcosa che abbia un comportamento di questo tipo:

  • consenta di rappresentare un insieme arbitrario di elementi (magari fornito attraverso binding)
  • consenta la selezione di un solo elemento alla volta
  • permetta la "lettura" dell'elemento selezionato attraverso una proprietà (che possa essere collegata con binding)

Ma un controllo del genere esiste già: è il ListBox. Si osservi ad esempio la window seguente:

<Window x:Class="DomusDotNetPills.RadioListBox"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Pillola RadioListBox"
SizeToContent="Height"
Width="300">

<Window.Resources>
<!-- simula una fonte dati -->
<x:Array x:Key="myItems"
Type="sys:String"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<sys:String>The</sys:String>
<sys:String>quick</sys:String>
<sys:String>brown</sys:String>
<sys:String>fox</sys:String>
</x:Array>

</Window.Resources>
<StackPanel>
<Label>Seleziona un elemento:</Label>
<ListBox Name="theListBox"
ItemsSource="{StaticResource myItems}">

</ListBox>

<Label>Elemento selezionato</Label>
<TextBox IsReadOnly="True"
Text="{Binding ElementName=theListBox, Path=SelectedItem}"></TextBox>

</StackPanel>
</Window>

La soluzione quindi è semplicemente dare al ListBox l'aspetto di un "RadioListBox", ovvero disegnare ogni elemento come un RadioButton e rappresentare la selezione di un elemento con l'attivazione del corrispondente RadioButton, piuttosto che con l'evidenziazione della riga. Definiamo perciò uno stile per il ListBox, alterando il template degli elementi contenuti (ListBoxItem):

<Window.Resources>
...
<Style x:Key="RadioListBoxItemStyle"
TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Border Background="Transparent">
<RadioButton IsChecked="{TemplateBinding IsSelected}"
Focusable="False"
IsHitTestVisible="False">
<ContentPresenter />
</RadioButton>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="RadioListBoxStyle"
TargetType="{x:Type ListBox}">
<Setter Property="ItemContainerStyle"
Value="{StaticResource RadioListBoxItemStyle}" />
</Style>
...
</Window.Resources>

Alcune brevi precisazioni:

  • RadioListBoxItemStyle
    è lo stile che applicheremo agli elementi (ListBoxItem) contenuti nel ListBox; questo stile imposta un'unica proprietà (Template): stiamo infatti alterando il modo in cui gli elementi vengono disegnati.
  • <ControlTemplate TargetType="{x:Type ListBoxItem}">
    il ControlTemplate specifica quali controlli primitivi saranno utilizzati nella visualizzazione degli elementi ListBoxItem: in pratica stiamo fornendo il "calco" con il quale saranno creati tutti i ListBoxItem.
    Dentro al control template troviamo un RadioButton: lo useremo, come anticipato, per rappresentare ciascun elemento; la proprietà IsChecked del RadioButton è collegata (attraverso un TemplateBinding) alla proprietà IsSelected del ListBoxItem: in questo modo l'elemento selezionato sarà visualizzato con un radio "pieno".
  • Focusable="False"
    Evita semplicemente che il RadioButton possa ricevere il focus: è sufficiente che lo riceva il contenitore (ListBoxItem).
  • IsHitTestVisible="False"
    Evita che il RadioButton sia "sensibile" alle operazioni del mouse; in pratica lo stiamo rendendo "passivo": ne capiremo presto il motivo.
  • <Border Background="Transparent">
    L'impostazione di uno sfondo trasparente sotto al RadioButton fa sì che le operazioni del mouse possano "oltrepassarlo" e raggiungere il ListBoxItem che lo contiene; questo (insieme all'aver reso il RadioButton "passivo" con IsHitTestVisible="False") consente di "disattivare" il comportamento predefinito del RadioButton stesso, cioè di "accendersi" quando viene cliccato. E' importante notare che lo stiamo utilizzando solo come rappresentazione della selezione: inibendo i suoi comportamenti "propri" lasciamo che la gestione della selezione al clic del mouse venga fatta dal ListBoxItem.
  • <ContentPresenter />
    In questo punto viene iniettato l'effettivo contenuto di ciascun ListBoxItem
  • RadioListBoxStyle
    è lo stile che applicheremo al ListBox: stiamo stabilendo che agli elementi contenuti nel ListBox (i ListBoxItem) venga applicato lo stile RadioListBoxItemStyle da noi definito. Il ListBox, come tutti gli ItemsControl, funziona con un corrispondente tipo di "sottoelementi": quando elementi di altra natura (nel nostro esempio delle stringhe) vengono aggiunti al ListBox, questi si occupa di "wrapparli" in un corrispondente ListBoxItem in modo da poterli gestire opportunamente; siamo quindi sicuri di poter intercettare tutti i possibili contenuti del ListBox senza

Completiamo l'esempio applicando lo stile definito al ListBox:

<ListBox Name="theListBox"
ItemsSource="{StaticResource myItems}"
Style="{StaticResource RadioListBoxStyle}">

ottenendo il risultato desiderato.

Questa tecnica è estremamente frequente in WPF: il codice dei controlli, infatti, non definisce il loro aspetto visuale, ma solo il loro comportamento; è possibile, quindi, dare un'aspetto grafico differente ai controlli pur mantenendone inalterata la logica di funzionamento. Si può affermare che WPF utilizza un pattern Presentation Model (MVVM) per i suoi stessi controlli.

Configurare Team Foundation Build 2008 per applicare le web.config transforms

Scritto da Daniele Rongione il 27 settembre 2010
Linguaggio: C#,VB   • Framework: 3.5   • Livello: 100 

Con Visual Studio 2010 è stata introdotta una nuova funzionalità per semplificare il deploy delle applicazioni web, le Config Transforms. Essendo una caratteristica di recente introduzione, Team Foundation Build 2008 non è in grado di interpretarla in modo nativo ma è necessario specificarlo manualmente all'interno dei file TFSBuild.proj.

In testa al file TFSBuild.proj, sotto l'istruzione di import di Microsoft.TeamFoundation.Build.targets, aggiungere l'import del nuovo target di compilazione per le applicazioni web:
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />

Nel target di BeforeDropBuild dello script, aggiungere l'istruzione di trasformazione, che sfrutta l'importazione appena effettuata del modulo TransformXml, adeguandone i percorsi alla propria struttura:


<Target Name="BeforeDropBuild">
<TransformXml Source="$(SolutionRoot)\WebsiteFolder\Web.config"
Transform="$(SolutionRoot)\WebsiteFolder\Web.Release.config"
Destination="$(OutDir)_PublishedWebsites\WebsiteAssemblyName\Web.config" />
</Target>

Come impostare il BOLD ad uno span tramite JQuery

Scritto da Alessandro Mostarda il 24 settembre 2010
Linguaggio: JS   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

Se abbiamo un controllo span il cui id è, ad esempio, IDSpan e vogliamo impostare il bold al testo contenuto, possiamo eseguire la seguente istruzione jQuery:

$("#IDSpan").attr("style", "font-weight:bold;");

Aggiungere un effetto 'mirror' ad un elemento WPF

Scritto da Pietro Libro il 20 settembre 2010
Framework: 3.5,4.0   • Livello: 100 

Se abbiamo un bottone WPF (o altro elemento) a cui vogliamo aggiungere un effetto mirror (specchio) possiamo utilizzare un oggetto Border impostandone le proprietà nel seguente modo:

<!-- Button a cui vogliamo applicare l'effetto mirror -->
<Button Height="35" HorizontalAlignment="Left" Name="button1" VerticalAlignment="Top" Width="75" Content="Button1" />
<!-- Border impostato per eseguire l'effetto desiderato -->
<Border Height="28" HorizontalAlignment="Left" Name="border1" VerticalAlignment="Top" Width="75" RenderTransformOrigin="0.5,0.5">
<Border.Background >
<VisualBrush Visual="{Binding ElementName=button1}" />
</Border.Background>

<Border.RenderTransform>
<ScaleTransform ScaleX="1" ScaleY="-1" />
</Border.RenderTransform>

<Border.OpacityMask>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Offset="0.0" Color="Transparent" ></GradientStop>
<GradientStop Offset="0.4" Color="Transparent" ></GradientStop>
<GradientStop Offset="1" Color="White" ></GradientStop>
</LinearGradientBrush>
</Border.OpacityMask>
</Border>

Abilitare il tracing in un applicazione WCF

Scritto da Antonio Pierascenzi il 17 settembre 2010
Framework: 3.0,3.5,4.0   • Livello: 200 

Per poter debuggare i nostri servizi WCF abbiamo bisogno di loggare tutte le operazioni che vengono fatte su di essi.
Questo meccanismo, che non è il comportamento di default in WCF, si può abilitare nel file di configurazione del client che utilizza il servizio sia a mano che attraverso il Service Configuration Editor. L'abilitazione di questa caratteristica farà sì che, nella path del progetto che funge da host per il servizio, verranno creati dei file con estensione .svclog ove è possibile reperire tutte le informazioni di cui abbiamo bisogno in fase di debug del servizio.
Questi file si possono aprire con l'utility SvcTraceViewer presente in C:\Program Files\Microsoft SDKs\Windows\v6.0\Bin.
Per maggiori dettagli sui parametri di configurazione del Message Logging fare riferimento a questo articolo su MSDN http://msdn.microsoft.com/en-us/library/ms730064.aspx.

Come calcolare la più piccola potenza di 2 contenente un numero

Scritto da Giorgio Di Nardo il 13 settembre 2010
Linguaggio: C#,VB   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

Dato un numero intero positivo maggiore di 1, la seguente istruzione permette di sapere qual è la minima potenza di 2 che lo contiene:

C#, VB.NET

Math.Pow(2, Math.Floor((Math.Log(numero - 1, 2) + 1)))

 

 

Come si aggregano stringhe con LINQ

Scritto da Massimo Bonanni il 10 settembre 2010
Linguaggio: C#,VB   • Framework: 3.5,4.0   • Livello: 100 

Se la variabile miaLista contiene una lista di stringhe, possiamo ottenere una stringa che concatena tutti gli elementi
della lista stessa con la seguente istruzione:

 VB.NET

Dim concatStr = miaLista.Aggregate(Function(currentString, nextString) _
currentString + nextString)

 

C#

var concatStr = miaLista.Aggregate((currentString,nextString)
=> currentString + nextString);

 

Metodi di estensione - AddRange

Scritto da Marco Amendola il 06 settembre 2010
Linguaggio: C#   • Framework: 3.5,4.0   • Livello: 100 

Semplice...

public static class CollectionExtension{
public static void AddRange<T>(this ICollection<T> self, IEnumerable<T> items)
{
foreach (var item in items)
{
self.Add(item);
}
}
}

 

...ma comodo (si noti che AddRange non è definito nell'interfaccia IList<>, ma solo nella classe List<>)

var mySource = new string[] { "The", "quick", "brown", "fox" };
IList myDestination = new List<string>();
myDestination.AddRange(mySource);

Recuperare i parametri della richiesta HTTP <GET> in MVC2

Scritto da Nicolò Carandini il 03 settembre 2010
Linguaggio: C#   • Framework: 3.5,4.0   • Livello: 100 

In un sito sviluppato con MVC 2 l'URL non corrisponde direttamente ad un file presente nel sito, ma viene interpretato mediante una routing table.
Ad esempio, l'URL http://miosito/torneo/risultati determina l'istanziazione del controller TorneoController e la chiamata al metodo Risultati (nel quale potremo elaborare i risulati del torneo e ritornare la pagina web che li visualizza).
Mentre l'URL http://miosito/torneo/risultatipartita/3 determina l'istanziazione del controller TorneoController e la chiamata al metodo RisultatiPartita con il parametro id pari a 3 (nel quale elaborare i dati relativi alla partita il cui id è pari a 3 e ...).
Questo grazie all'impostazione di default contenuta nella routing table, contenuta nel file Global.Asax, che può esssere ampliata e modificata a piacere.
Se abbiamo necessità di passare più parametri al metodo del controller, è possibile utilizzare la codifica HTTP <GET>, come ad esempio:
http://miosito/torneo/risultatipartita?GiornataID=8&SquadraID=12&Anno=2007
In questo caso, per recuperare le informazioni contenute nei parametri della richiesta HTTP <GET> possiamo usare l'oggetto Request.QueryString:

namespace MioProgetto.Controllers
{
public class TorneoController : Controller
{
//
// GET: /torneo/risultatipartita?GiornataID=[giornataID]&SquadraID=[squadraID]&Anno=[anno]

public void RisultatiPartita()
{
// Attenzione: in questo esempio non ci sono controlli...
string giornataID = Request.QueryString[0];
string squadraID = Request.QueryString[1];
string anno= Request.QueryString[2];
}
// attenzione: normalmente un controller ritorna una view, qui scriviamo direttamente l'html...
Response.Write("<h1>Sono stati richiesti i risultati della partita:</h1>" +
"<p>GiornataID: " + giornataID + "</p>" +
"<p>SquadraID: " + squadraID + "</p>" +
"<p>Anno: " + anno + "</p>"
);
}
}
}

 

Configurare Team Foundation Build 2008 per compilare solution Visual Studio 2010

Scritto da Daniele Rongione il 30 agosto 2010
Livello: 200 

Con Visual Studio 2010 è stata introdotta una nuova funzionalità per semplificare il deploy delle applicazioni web, le Config Transforms. Essendo una caratteristica di recente introduzione, Team Foundation Build 2008 non è in grado di interpretarla in modo nativo ma è necessario specificarlo manualmente all'interno dei file TFSBuild.proj.

In testa al file TFSBuild.proj, sotto l'istruzione di import di Microsoft.TeamFoundation.Build.targets, aggiungere l'import del nuovo target di compilazione per le applicazioni web:

<Import
Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />

 

Nel target di BeforeDropBuild dello script, aggiungere l'istruzione di trasformazione, che sfrutta l'importazione appena effettuata del modulo TransformXml, adeguandone i percorsi alla propria struttura:

<Target Name="BeforeDropBuild">
<TransformXml Source="$(SolutionRoot)\WebsiteFolder\Web.config"
Transform="$(SolutionRoot)\WebsiteFolder\Web.Release.config"
Destination="$(OutDir)_PublishedWebsites\WebsiteAssemblyName\Web.config" />
</Target>

Come calcolare il numero di bit necessari per la memorizzazione di un numero

Scritto da Giorgio Di Nardo il 27 agosto 2010
Linguaggio: C#,VB   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

A volte può essere utile, dato un numero intero, conoscere il numero di bit necessari per rappresentarlo in notazione binaria.

La seguente funzione esegue questo calcolo:

C#

public Int32 NumberOfBits(Int32 number)
{
return number==0 ? 1: Convert.ToInt32(Math.Floor(Math.Log(number, 2))) + 1;
}

 

VB.NET

Public Function NumberOfBits(ByVal number As Integer) As Integer
Return If(number = 0, 1, Convert.ToInt32(Math.Floor(Math.Log(number, 2))) + 1)
End Function

Metodi di estensione - Cast & As

Scritto da Marco Amendola il 23 agosto 2010
Linguaggio: C#   • Framework: 3.5,4.0   • Livello: 100 

Ho sempre trovato la sintassi del cast in C# piuttosto scomoda, per diversi motivi.

Innanzi tutto la posizione in cui viene indicato il tipo (prima del resto dell'espressione) costringe a pensarci prima di scrivere l'espressione, oppure a tornare indietro successivamente.
Inoltre la presenza delle parentesi rende meno scorrevole la concatenazioni di espressioni dopo l'applicazione del cast:

var myResult = ((ALongTypeName)myInstance).CallAMethod();


L'operatore as ha almeno il vantaggio di avere l'indicazione del tipo dopo l'espressione, ma è comunque scomodo in espressioni composte (*).

Utilizzando questi metodi di estensione:

public static T Cast<T>(this object self)
{
return (T)self;
}
public static T As<T>(this object self) where T : class
{
return self as T;
}

è possibile scrivere espressioni più "fluenti":

var myResult = myInstance.Cast<ALongTypeName>().CallAMethod();
var myResult = myInstance.As<ALongTypeName>();

* L'operatore as ha anche delle importanti differenze semantiche rispetto al cast, che possono essere approfondite in questo articolo.

Come si recupera un elemento casuale da una lista con LINQ

Scritto da Massimo Bonanni il 20 agosto 2010
Linguaggio: C#,VB   • Framework: 3.5,4.0   • Livello: 100 

Dato un oggetto che implementa l'interfaccia IEnumerable, possiamo recuperare un elemento casuale dalla lista nel seguente modo:

C#

Random  rnd = new Random(DateTime.Now.Millisecond);
var retval = coll.Skip(rnd.Next(coll.Count(x => true))).Take(1).First();

 

VB

Dim rnd As New Random(DateTime.Now.Millisecond)
Dim retval = coll.Skip(rnd.Next(coll.Count)).Take(1).First()

 

 In entrambe le versioni, coll è l'oggetto che implementa IEnumerable.

Come ricavare il percorso fisico da uno virtuale e viceversa?

Scritto da Luca Cestola il 16 agosto 2010
Linguaggio: C#,VB   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

Ricavare il percorso fisico da uno virtuale è un'operazione semplice grazie al metodo MapPath della classe HttpServerUtility (esposta dalla pagina aspx attraverso la proprietà Server), mentre non esiste un metodo già pronto per fare l'opposto. La spiegazione sta nel fatto che un percorso fisico potrebbe essere incluso in più virtual directory (senza tener conto della presenza di eventuali meccanismi di url-rewriting).

Se la configurazione del sito è lineare e quindi l'alberatura è uno a uno con quella fisica, allora è possibile ricostruire il percorso fisico da quello virtuale. Ecco un esempio che possiamo provare facilmente.

C#

protected void Page_Load(object sender, EventArgs e)
{
string rootPath = Server.MapPath("~/");
// Le seguenti variabili sono inizializzate a partire dalla pagina corrente solo a titolo d'esempio
string virtualPath = Request.AppRelativeCurrentExecutionFilePath;
string physicalPath = Server.MapPath(Request.AppRelativeCurrentExecutionFilePath);

// Da percorso virtuale a fisico
Response.Write(Request.AppRelativeCurrentExecutionFilePath + " -> " + Server.MapPath(Request.AppRelativeCurrentExecutionFilePath));
Response.Write("<br/>");

// Da percorso fisico a virtuale
string virtualPathFromPhysic = "~/" + physicalPath.Replace(rootPath, "").Replace("\\", "/");
Response.Write(physicalPath + "
-> " + virtualPathFromPhysic);
}

 

VB.NET

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim rootPath As String = Server.MapPath("~/")
' Le seguenti variabili sono inizializzate a partire dalla pagina corrente solo a titolo d'esempio
Dim virtualPath As String = Request.AppRelativeCurrentExecutionFilePath
Dim physicalPath As String = Server.MapPath(Request.AppRelativeCurrentExecutionFilePath)

' Da percorso virtuale a fisico
Response.Write((Request.AppRelativeCurrentExecutionFilePath + (" -> " + Server.MapPath(Request.AppRelativeCurrentExecutionFilePath))))
Response.Write("<br/>")

' Da percorso fisico a virtuale
Dim virtualPathFromPhysic As String = ("~/" + Replace(Replace(physicalPath, rootPath, ""), "\\", "/"))
Response.Write((physicalPath + (" -> " + virtualPathFromPhysic)))
End Sub

 

Ereditarietà e servizi WCF

Scritto da Alessandro Mostarda il 13 agosto 2010
Linguaggio: C#,VB   • Framework: 3.0,3.5,4.0   • Livello: 200 

Esporre una classe base, come parametro di un metodo di un servizio WCF e stabilire quali classi, di quelle che ereditano, possono essere passate come parametro:

C#
Classe di base (esposta come parametro):

[Serializable]
[KnownType(typeof(Rettile))]
[KnownType(typeof(Volatile))]
[DataContract]
public abstract class Animale
{
[DataMember]
public int Id { get; set;}
}


Classi derivate

[DataContract]
public class Rettile : Animale
{
[DataMember]
public string Colore { get; set; }
}

[DataContract]
public class Volatile: Animale
{
[DataMember]
public int LunghezzaAli { get; set; }
}

 

VB.NET
Classe di base (esposta come parametro):

<Serializable()> _
<KnownType(GetType(Rettile))> _
<KnownType(GetType(Volatile))> _
<DataContract()> _
Public MustInherit Class Animale
<DataMember()> _
Public Property Id() As Integer
End Class


Classi derivate

<DataContract()> _
Public Class Rettile
Inherits Animale
<DataMember()> _
Public Property Colore() As String
End Class

<DataContract()> _
Public Class Volatile
Inherits Animale
<DataMember()> _
Public Property LunghezzaAli() As Integer
End Class

 

Come utilizzare Parallel.For

Scritto da Pietro Libro il 09 agosto 2010
Linguaggio: C#,VB   • Framework: 3.5,4.0   • Livello: 100 

Il namespace System.Threading.Tasks fornisce una serie di classi che semplificano la scrittura di codice concorrente ed asincrono: una di queste è la classe Parallel contenente metodi che supportano la creazione di cicli paralleli. Uno dei membri della classe è For e relativi overload:

C#

////Popolo l'array di interi.
int[] numeri = new int[500];
for (int i = 0; i < 500; i++) { numeri[i] = i + 1; }
Parallel.For(0, numeri.Length, (i) =>
{
///Calcolo
Console.WriteLine(numeri[i] * 2);
});

 

VB.NET

Dim numeri As Integer() = Nothing
'Popolo l'array di interi.
numeri = Array.CreateInstance(GetType(Integer), 500)
For i As Integer = 0 To 499
numeri(i) = i + 1
Next

Parallel.For(0, numeri.Length,
Sub(i)
Console.WriteLine(numeri(i) * 2)
End Sub)

 

Come effettuare la conversione di una data scritta in un formato fuori standard?

Scritto da Giorgio Di Nardo il 06 agosto 2010
Linguaggio: C#,VB   • Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

Può capitare di avere una data contenuta in una stringa il cui formato non sia standard. Per poter convertire tale data in un oggetto DateTime si può procedere nel seguente modo:

C#

string[] formats = new string[2] {"ddMMyyyy", "yyyy,MM,dd"}
string result = DateTime.ParseExact(strDate, formats,
System.Globalization.CultureInfo.CurrentCulture,
System.Globalization.DateTimeStyles.None)

 

VB.NET

Dim formats As String() = New String() {"ddMMyyyy", "yyyy,MM,dd"}
Dim result = DateTime.ParseExact(strDate, formats, _
System.Globalization.CultureInfo.CurrentCulture, _
System.Globalization.DateTimeStyles.None)

Reinstallare i template di progetto in Visual Studio

Scritto da Matteo Emili il 02 agosto 2010
Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

Può capitare che spariscano i template di progetto a seguito dell'installazione di qualche componente non definitivo. Per ripristinarlo, da linea di comando:

devenv.exe /InstallVSTemplates

 

I template si trovano tutti in <folder di installazione di Visual Studio>\Common7\IDE\ProjectTemplates e <folder di installazione di Visual Studio>\Common7\IDE\ItemTemplates.

Metodi di estensione - ForEach

Scritto da Marco Amendola il 30 luglio 2010
Linguaggio: C#,VB   • Framework: 3.5,4.0   • Livello: 100 

Un metodo di estensione, divenuto ormai un classico, utile a "distribuire" un'azione su tutti gli elementi di un IEnumerable<>

C#

public static class EnumerableExtension
{
public static void ForEach<T>(this IEnumerable<T> self, Action<T> action)
{
if (action == null) return;
foreach (var item in self)
action.Invoke(item);
}
}

 

VB.NET

Imports System.Runtime.CompilerServices

Public Module Extensions

<Extension()> _
Public Sub ForEach(Of T)(ByVal ienum As IEnumerable(Of T), ByVal action As Action(Of T))
If action IsNot Nothing Then
For Each item In ienum
action.Invoke(item)
Next
End If
End Sub

End Module

 

Di seguito un esempio di utilizzo:

C#

var mySourceStringArray = new string[] { "The", "quick", "brown", "fox"};
var myDestinationStringList = new List<string>();
mySourceStringArray.ForEach(myDestination.Add);
myDestinationStringList.ForEach(x => Debug.Write(x + " "));

 

VB.NET

Private Sub Main()
Dim mySourceStringArray = New String() {"The", "quick", "brown", "fox"}
Dim myDestinationStringList = New List(Of String)()
mySourceStringArray.ForEach(AddressOf myDestinationStringList.Add)
myDestinationStringList.ForEach(AddressOf Write)
End Sub

Private Sub Write(ByVal x As String)
Debug.Write(x + " ")
End Sub

 

Ottenere gli indirizzi IP della macchina

Scritto da Massimiliano Bellisario il 26 luglio 2010
Linguaggio: C#,VB   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

A volte risulta molto utile ottenere gli IP addresses della macchina.
Di seguito il codice :

C#

System.Net.IPAddress[] a = System.Net.Dns.GetHostAddresses(System.Net.Dns.GetHostName());

for (int i = 0; i < a.Length; i++)
{
Console.WriteLine(a[i].ToString());
}


VB.NET

Dim a() As System.Net.IPAddress = _
System.Net.Dns.GetHostAddresses(System.Net.Dns.GetHostName())

For i As Integer = 0 To a.Length - 1
Console.WriteLine(a(i).ToString())
Next

 

Nascondere il membro di una classe all'intellisense di Visual Studio

Scritto da Massimo Bonanni il 23 luglio 2010
Linguaggio: C#,VB   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 200 

Utilizzando la classe EditorBrowsableAttribute del namespace System.ComponentModel è possibile far in modo che un membro pubblico di una nostra classe non sia visibile all'intellisense di Visual Studio, cioè non sia presente nella lista dei membri che compare nella casella a discesa dell'intellisense.
Un esempio di utilizzo è il seguente:

VB

Public Class MiaClasse

<EditorBrowsable(EditorBrowsableState.Never)> _
Public Sub MetodoNascosto()

End Sub

Public Sub MetodoVisibile()

End Sub
End Class

 

C#

public class MiaClasse
{
[EditorBrowsable(EditorBrowsableState.Never )]
public void MetodoNascosto()
{
}

public void MetodoVisibile()
{
}
}


Attenzione perchè in C# l'attributo non nasconde i membri delle classi all'interno dello stesso assembly.

Come usare le espressioni per inserire il valore di una risorsa di tipo stringa in una pagina ASP.NET?

Scritto da Luca Cestola il 19 luglio 2010
Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

A volte è comodo poter definire dei valori in un file di risorse (.resx) come costante di tipo stringa da poter inserire nelle nostre pagine aspx. Supponiamo ad esempio di voler inserire in una pagina una label contenente la dicitura "Questo è un esempio". Possiamo aggiungere una risorsa di tipo stringa in un file Risorse.resx denominata "Example" con valore "Questo è un esempio". Nella pagina aspx possiamo ora scrivere semplicemente:


<asp:Label id="LabelTitolo" runat="server" text="<%$ Resources: Risorse, Example %>" />


Successivamente possiamo cambiare il valore all'interno del file di risorse ed avere automaticamente il nuovo valore nella label. Questo approccio è molto utile nel caso si vogliano mostrare informazioni in lingue diverse, poichè in questo caso basta aggiungere un file di risorse per la specifica lingua per ottenere il testo della label tradotto automaticamente. Per creare, ad esempio, un file di risorse in lingua inglese è sufficiente copiare il file .resx tramite il Solution Explorer e rinominarlo utilizzando il seguente criterio:

Risorse.en.resx

Utilizzare le icone dei programmi Microsoft

Scritto da Nicolò Carandini il 16 luglio 2010
Livello: 100 

Molte delle icone che si trovano nei programmi Microsoft sono liberamente utilizzabili anche nelle nostre applicazioni, seguendo le opportune indicazioni e le limitazioni di utilizzo.
Nella cartella C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\VS2010ImageLibrary\1040 (nel caso di un S.O. a 64 bit con VS2010 italiano, da cui è facile derivare gli altri casi) troviamo il file VS2010ImageLibrary.zip che contiene una ricca libreria di icone.
Per comodità d'uso, io solitamente espando il file nella cartella Documenti\Visual Studio 2010.

Come ottenere la rappresentazione esadecimale di un numero?

Scritto da Giorgio Di Nardo il 12 luglio 2010
Linguaggio: C#,VB   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

Per convertire un qualsiasi numero nel formato esadecimale possiamo scrivere:

C#

Int32 numero = 100;
string strNumero = numero.ToString("X");

 

VB

Dim numero As Integer = 100
Dim strNumero = numero.ToString("X")

Ordinare una lista in memoria in base ad una proprietà per nome

Scritto da Alessandro Mostarda il 09 luglio 2010
Linguaggio: C#,VB   • Framework: 3.5,4.0   • Livello: 200 

Se abbiamo necessità di ordinare una lista per una proprietà della quale, però, abbiamo il nome in formato stringa, possiamo utilizzare uno dei seguenti extension method:

C#


using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;

public static class OrderByExpressions
{

//Order by che accetta il nome della proprietà in input
public static IOrderedQueryable<T> OrderBy<T>(this IEnumerable<T> list, string fieldName)
{
return OrderBy(list, fieldName, false);
}

//Order by Descending che accetta il nome della proprietà in input
public static IOrderedQueryable<T> OrderByDescending<T>(this IEnumerable<T> list, string fieldName)
{
return OrderBy(list, fieldName, true);
}

//Then by che accetta il nome della proprietà in input
public static IOrderedQueryable<T> ThenBy<T>(this IOrderedQueryable<T> list, string fieldName)
{
return ThenBy(list, fieldName, false);
}

//Then by Descending che accetta il nome della proprietà in input
public static IOrderedQueryable<T> ThenByDescending<T>(this IOrderedQueryable<T> list, string fieldName)
{
return ThenBy(list, fieldName, true);
}

//Order che accetta input un elenco di nomi di proprietà e il tipo di ordinamaneto(False = Descending, True = Ascenbing)
public static IOrderedQueryable<T> Order<T>(this IEnumerable<T> list, Dictionary<string, bool> fields)
{
IOrderedQueryable<T> temp = null;
bool first = true;
foreach (KeyValuePair<string, bool> field in fields)
{
if (first)
{
temp = OrderBy(list, field.Key, field.Value);
first = false;
} else {
temp = ThenBy(temp, field.Key, field.Value);
}
}
return temp;
}

private static IOrderedQueryable<T> OrderBy<T>(IEnumerable<T> list, string fieldName, bool descending)
{
var orderExpression = GetOrderExpression(list, fieldName);
if (descending)
{
return list.AsQueryable().OrderByDescending(orderExpression);
} else {
return list.AsQueryable().OrderBy(orderExpression);
}
}

private static IOrderedQueryable<T> ThenBy<T>(IOrderedQueryable<T> list, string fieldName, bool descending)
{
var orderExpression = GetOrderExpression(list, fieldName);
if (descending)
{
return list.ThenByDescending(orderExpression);
} else {
return list.ThenBy(orderExpression);
}
}

private static Expression<Func<T, object>> GetOrderExpression<T>(IEnumerable<T> list, string fieldName)
{
var parameterExpression = Expression.Parameter(typeof(T), "item");
var memberExpression = Expression.Property(parameterExpression, fieldName);
var expression = Expression.Convert(memberExpression, typeof(object));
return Expression.Lambda<Func<T, object>>(expression, parameterExpression);
}
}


VB.NET

Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Linq.Expressions
Imports System.Text
Imports System.Runtime.CompilerServices

Public Module OrderByExpressions

'Order by che accetta il nome della proprietà in input
<Extension()> Public Function OrderBy(Of T)(ByVal list As IEnumerable(Of T), ByVal fieldName As String) As IOrderedQueryable(Of T)
Return OrderBy(list, fieldName, False)
End Function

'Order by Descending che accetta il nome della proprietà in input
<Extension()> Public Function OrderByDescending(Of T)(ByVal list As IEnumerable(Of T), ByVal fieldName As String) As IOrderedQueryable(Of T)
Return OrderBy(list, fieldName, True)
End Function

'Then by che accetta il nome della proprietà in input
<Extension()> Public Function ThenBy(Of T)(ByVal list As IOrderedQueryable(Of T), ByVal fieldName As String) As IOrderedQueryable(Of T)
Return ThenBy(list, fieldName, False)
End Function

'Then by Descending che accetta il nome della proprietà in input
<Extension()> Public Function ThenByDescending(Of T)(ByVal list As IOrderedQueryable(Of T), ByVal fieldName As String) As IOrderedQueryable(Of T)
Return ThenBy(list, fieldName, True)
End Function

'Order che accetta input un elenco di nomi di proprietà e il tipo di ordinamaneto(False = Descending, True = Ascenbing)
<Extension()> Public Function Order(Of T)(ByVal list As IEnumerable(Of T), ByVal fields As Dictionary(Of String, Boolean)) As IOrderedQueryable(Of T)
Dim temp As IOrderedQueryable(Of T) = Nothing
Dim first As Boolean = True
For Each field As KeyValuePair(Of String, Boolean) In fields
If first Then
temp = OrderBy(list, field.Key, field.Value)
first = False
Else
temp = ThenBy(temp, field.Key, field.Value)
End If
Next
Return temp
End Function

Private Function OrderBy(Of T)(ByVal list As IEnumerable(Of T), ByVal fieldName As String, ByVal descending As Boolean) As IOrderedQueryable(Of T)
Dim orderExpression = GetOrderExpression(list, fieldName)
If descending Then
Return list.AsQueryable().OrderByDescending(orderExpression)
Else
Return list.AsQueryable().OrderBy(orderExpression)
End If
End Function

Private Function ThenBy(Of T)(ByVal list As IOrderedQueryable(Of T), ByVal fieldName As String, ByVal descending As Boolean) As IOrderedQueryable(Of T)
Dim orderExpression = GetOrderExpression(list, fieldName)
If descending Then
Return list.ThenByDescending(orderExpression)
Else
Return list.ThenBy(orderExpression)
End If
End Function

Private Function GetOrderExpression(Of T)(ByVal list As IEnumerable(Of T), ByVal fieldName As String) As Expression(Of Func(Of T, Object))
Dim parameterExpression = Expression.Parameter(GetType(T), "item")
Dim memberExpression = Expression.Property(parameterExpression, fieldName)
Dim express = Expression.Convert(memberExpression, GetType(Object))
Return Expression.Lambda(Of Func(Of T, Object))(express, parameterExpression)
End Function
End Module

Resettare i package di Visual Studio

Scritto da Matteo Emili il 05 luglio 2010

Spesso può servire di resettare i package di Visual Studio.

Si può eseguire questa operazione da linea di comando digitando:

Devenv.exe /ResetSkipPkgs

Accesso alla proprietà BaseUri negli XObject (Linq to Xml)

Scritto da Marco Amendola il 02 luglio 2010
Linguaggio: C#,VB   • Framework: 3.0,3.5,4.0   • Livello: 200 

Gli oggetti XmlNode contenuti in un DOM (System.Xml.XmlDocument) possiedono una proprietà BaseURI che contiene la posizione da cui tale nodo è stato caricato. Se il DOM viene caricato da un server http, ad esempio, BaseURI conterrà un Uri del tipo "http://server/file.xml" per ognuno dei nodi di cui è composto il documento Xml. La proprietà BaseURI è utile, nei casi in cui un documento sia composto da parti provenienti da fonti diverse, ad identificare la radice di eventuali Uri relativi presenti nel documento stesso.

Se per manipolare Xml si utilizzano le classi di "Linq To Sql" (System.Xml.Linq) al posto del DOM, è possibile utilizzare l'analoga proprietà BaseUri; in questo caso, però, occorre prestare attenzione alla fase di caricamento dell'XDocument.
Per default, infatti, il caricamento non conserva l'informazione della posizione di provenienza dell'Xml (in quanto ciò richiederebbe una piccola penalizzazione delle prestazioni) e la proprietà BaseUri restituisce sempre un valore nullo.

Per far sì che durante il caricamento venga mantenuta questa informazione, rendendo significativi i valori di BaseUri, occorre utilizzare nel metodo Load l'opzione LoadOptions.SetBaseUri:

C#

XDocument myXDoc = XDocument.Load("http://server/file.xml", LoadOptions.SetBaseUri);

 

VB

Dim myXDoc As XDocument = XDocument.Load("http://server/file.xml", LoadOptions.SetBaseUri)
 
 

Come eseguire gli Unit Test in processi a 64 bit con Visual Studio 2010

Scritto da Nicolò Carandini il 28 giugno 2010
Framework: 4.0   • Livello: 100 

Aprire le impostazioni dei test con doppio click su Local.testsettings (che si trova nella cartella Solution Items) e selezionare la sezione Hosts.

Nel menù a tendina sotto la voce Run tests in 32 or 64 bit process scegliere l'opzione Run tests in 64 bit process on 64 bit machine.

Utilizzare BisSubscribe per sottoscrivere nuovi work item in TFS

Scritto da Matteo Emili il 24 giugno 2010

BisSubscribe è un tool che ci permette di sottoscrivere notifiche di eventi generati da un server TFS. Lo possiamo utilizzare mediante il prompt dei comandi di Visual Studio.

Per ottenere i nuovi work item a noi assegnati, ad esempio, si può procedere così:

BisSubscribe.exe /userId DOMINIO\Utente /eventType WorkItemChangedEvent
/deliveryType EmailHtml /domain FQDN-DEL-SERVER /address EMAIL /filter
"PortfolioProject = 'PROGETTO' AND ChangeType = 'New' "

Verificare l'esistenza di un'istanza dell'applicazione

Scritto da Massimiliano Bellisario il 22 giugno 2010
Linguaggio: C#,VB   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

In molti casi si ha bisogno di sapere esiste già un'instanza in esecuzione della nostra applicazione.
Per ricavarlo si può utilizzare la Reflection tramite il seguente snippet di codice:

VB:

Imports System.Threading
Public Function Check() As Boolean
Dim bAppFirstInstance As Boolean
Dim oMutex = New Mutex(True, "Global\\" + "MyApp", bAppFirstInstance)
Return bAppFirstInstance
End Function

 

C#:

using System.Threading;
bool Check()
{
bool bAppFirstInstance;
Mutex oMutex = new Mutex(true, "Global\\" + "MyApp", out bAppFirstInstance);
return bAppFirstInstance;
}

Interrompere un download sul server se il browser si disconnette o annulla il download.

Scritto da Luca Cestola il 18 giugno 2010 (aggiornato il 14 giugno 2010)
Linguaggio: C#,VB   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

La proprietà IsClientConnected della classe System.Web.HTTPResponse indica se il browser è ancora connesso durante la ricezione dei dati. È molto utile nel caso in cui si generi manualmente il flusso di dati da inviare al client e si voglia interrompere l'invio se, nel frattempo, l'utente annulla il download o chiude il browser.

C#

byte[] buffer;

while (Response.IsClientConnected)
{
// Impostare il contenuto di buffer

Response.OutputStream.Write(buffer, 0, buffer.Length);
Response.Flush();
}

 

VB.NET

Dim buffer() As Byte

While Response.IsClientConnected
' Impostare il contenuto di buffer

Response.OutputStream.Write(buffer, 0, buffer.Length)
Response.Flush()
End While

Come si utilizza il web server di Visual Studio da riga di comando?

Scritto da Massimo Bonanni il 15 giugno 2010
Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

Se il nostro sito è nella cartella c:\miosito, ed il framework che vogliamo utilizzare è il 4.0, il comando da lanciare è il seguente:

WebDev.WebServer40.EXE /port:6000 /path:"c:\miosito"


dove 6000 è la porta con cui pubblicare il sito.

L'eseguibile si trova nella cartella C:\Program Files\Common Files\microsoft shared\DevServer\10.0 (9.0 per Visual Studio 2008).

Digitando il comando privo di parametri si ottiene l'help.

Inviare un'e-mail con due righe di codice

Scritto da Pietro Libro il 10 giugno 2010
Linguaggio: C#,VB   • Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

Dopo aver aggiunto il riferimento alla libreria System.Net al progetto, è possibile inviare un'e-mail in questo modo:

C#

System.Net.Mail.SmtpClient sClient = new System.Net.Mail.SmtpClient("mail.dominio");
sClient.Send("from@xyz.it", "to@wdr.it","Subject", "Mail Body");


VB

Dim sClient As System.Net.Mail.SmtpClient = New System.Net.Mail.SmtpClient("mail.dominio")
sClient.Send("from@xyz.it", "to@wdr.it", "Subject", "Mail Body")

Highlighting Rows in a GridView

Scritto da Massimiliano Bellisario il 08 giugno 2010
Linguaggio: C#,VB   • Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

Per implementare un effetto di colorazione delle righe di una GridView è sufficiente implementare i gestori degli eventi javascript onmouseover e onmouseout. Per fare ciò possiamo utilizzare l'evento RowDataBound della classe GridView:

C#

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
if (e.Row.RowState == DataControlRowState.Alternate || e.Row.RowState == DataControlRowState.Normal)
{
e.Row.Attributes.Add("onmouseover",
"this.savedColor=this.style.backgroundColor;this.style.backgroundColor='Yellow'");
e.Row.Attributes.Add("onmouseout",
"this.style.backgroundColor=this.savedColor;");
}
}
}


VB.NET

Private Sub GridView1_RowDataBound(ByVal sender As Object, _
ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) _
Handles GridView1.RowDataBound
If e.Row.RowType = DataControlRowType.DataRow Then
If e.Row.RowState = DataControlRowState.Alternate Or e.Row.RowState = DataControlRowState.Normal Then
e.Row.Attributes.Add("onmouseover", _
"this.savedColor=this.style.backgroundColor;this.style.backgroundColor='Yellow'")
e.Row.Attributes.Add("onmouseout", _
"this.style.backgroundColor=this.savedColor;")
End If
End If
End Sub

Come si associa un'icona ad un server control custom

Scritto da Antonio Pierascenzi il 04 giugno 2010
Linguaggio: C#,VB   • Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

Per associare un'icona ad un nostro server control procedere nel seguente modo:

  1. Scegliere un'icona 16x16 e allegarla al progetto nella root o dove risiede il codice del controllo, facendo attenzione nel chiamarla come la classe del controllo e al fatto che è case-sensitive e che sia in formato .bmp
  2. includerla nel progetto e scegliere Embedded Resource nelle proprietà dell'immagine sezione Build Action
  3. Una volta compilata la libreria aggiungerla alla ToolBox, scegliendo Choose Items



Definire un XML namespace per una libreria di controlli WPF

Scritto da Marco Amendola il 01 giugno 2010
Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

Supponiamo di aver definito un controllo MyControl all'interno di una libreria DomusDotNetPills.Controls:

namespace DomusDotNetPills.Controls
{
public class MyControl: Control
{

}
}

Per utilizzarlo all'interno di documento XAML, com'è noto, occorre definire un alias per il namespace CLR del controllo e qualificare tutte le istanze con l'alias scelto:

<Window x:Class="DomusDotNetPills.XmlnsDef"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ddnp="clr-namespace:DomusDotNetPills.Controls;assembly=DomusDotNetPills.Controls"
>
<Grid>
<ddnp:MyControl />
</Grid>
</Window>

L'espressione clr-namespace:DomusDotNetPills.Controls;assembly=DomusDotNetPills.Controls identifica univocamente il namespace CLR all'interno di un determinato assembly.
Per utilizzare, al posto di questa espressione, un namespace XML, occorre prima di tutto definirlo nell'assembly contenente il controllo; aggiungendo l'attributo

[assembly: XmlnsDefinition("http://domusdotnet.org/pills/xaml", "DomusDotNetPills.Controls")]

all'interno del file AssemblyInfo.cs si ottiene l'associazione del namaspace CLRDomusDotNetPills.Controls con il più leggibile e appropriato namespace XML.
A questo punto l'alias può essere dichiarato nello XAML come segue

<Window x:Class="DomusDotNetPills.XmlnsDef"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ddnp="http://domusdotnet.org/pills/xaml""
>
<Grid>
<ddnp:MyControl />
</Grid>
</Window>

Oltre alla maggiore leggibilità, si ottiene il vantaggio di poter includere nello stesso namespace XML diversi namespace CLR, similmente a quanto avviene con i controlli WPF standard (mentre normalmente sarebbe stato necessario dichiarare diversi alias):

namespace DomusDotNetPills.Controls.Advanced
{
public class MyAdvancedControl: Control
{

}
}

 

[assembly: XmlnsDefinition("http://domusdotnet.org/pills/xaml", "DomusDotNetPills.Controls")]
[assembly: XmlnsDefinition("http://domusdotnet.org/pills/xaml", "DomusDotNetPills.Controls.Advanced")]
<Window x:Class="DomusDotNetPills.XmlnsDef"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ddnp="http://domusdotnet.org/pills/xaml""
>
<StackPanel>
<ddnp:MyControl />
<ddnp:MyAdvancedControl />
</StackPanel>
</Window>

Come filtrare i processi in esecuzione utilizzando LINQ?

Scritto da Pietro Libro il 27 maggio 2010
Linguaggio: C#,VB   • Framework: 3.5,4.0   • Livello: 100 

Per filtrare, tra i processi correntemente in esecuzione sulla propria macchina , solo quelli che contengono una particolare parola all'interno del titolo della finestra principale, possiamo utilizzare LINQ To Objects e la classe System.Diagnostic.Process. Nell'esempio visualizziamo il nome e l'id dei processi che contengono "Visual":

C#

List<System.Diagnostics.Process> processes = System.Diagnostics.Process.GetProcesses()
    .Where(p => p.MainWindowTitle.Contains("Visual")).ToList();
   
foreach (System.Diagnostics.Process p in processes)
{
    Console.WriteLine("Name: {0} Id:{1}", p.ProcessName, p.Id);
}


VB.NET

Dim processes As List(Of System.Diagnostics.Process) = _
   System.Diagnostics.Process.GetProcesses().Where( _
   Function(p) p.MainWindowTitle.Contains("Visual")).ToList

For Each p As System.Diagnostics.Process In processes
    Console.WriteLine("Name: {0} Id:{1}", p.ProcessName, p.Id)
Next

Note sul comportamento dell'operatore primario di incremento ++ (e --)

Scritto da Luca Cestola il 25 maggio 2010
Linguaggio: C#   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

Eseguendo il codice:

int i = 1;
i = i++;
Console.WriteLine(i);


la variabile i mostrata a video contiene il valore 1 e non 2, come potrebbe sembrare ad una rapida occhiata. Questo è dovuto al funzionamento interno del compilatore, che prima di eseguire l'incremento, crea una copia temporanea della variabile i ed esegue l'assegnazione, ad i stessa, con il valore della copia contenente il vecchio valore.

La logica è la seguente:

  • assegna 1 ad i
  • copia i in [temporanea]
  • incrementa i
  • assegna temp ad i

L'esempio esposto chiaramente non ha senso, ma serve a capire il comportamento dell'operatore in espressioni più complesse.

Per chi non si accontenta, da Visual Studio Debug->Windows->Disassembly è possibile vedere il codice generato dal compilatore.

Come ottenere la rappresentazione binaria di un numero?

Scritto da Giorgio Di Nardo il 20 maggio 2010
Linguaggio: C#,VB   • Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

Per ottenere la rappresentazione binaria di un numero si può ricorrere al metodo ToString() della classe System.Convert:

C#

string binStr = Convert.ToString(numero, 2);

 

VB.NET

Dim binStr = Convert.ToString(numero, 2)

Come recuperare il percorso dell'eseguibile?

Scritto da Massimo Bonanni il 18 maggio 2010
Linguaggio: C#,VB   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

Nei casi in cui sia necessario determinare il percorso dell'eseguibile in esecuzione è possibile utilizzare la proprietà Location dell'oggetto Assembly restituito dal metodo statico GetEntryAssembly() della classe Assembly definita nel namespace System.Reflection.

C#

using System;
using System.IO;
using System.Reflection;

namespace DomusDotNet
{
namespace Pillole
{
class Program
{
static void Main(string[] args)
{
string location = Assembly.GetEntryAssembly().Location;
Console.WriteLine("L'eseguibile si trova nella cartella {0}", Path.GetDirectoryName(location));
Console.WriteLine("Premi invio per uscire");
Console.Read();
}
}
}
}

 

VB.NET

Imports System.IO
Imports System.Reflection

Namespace DomusDotNet

Namespace Pillole

Module Module1

Sub Main()
Dim location = Assembly.GetEntryAssembly().Location
Console.WriteLine("L'eseguibile si trova nella cartella {0}", Path.GetDirectoryName(location))
Console.WriteLine("Premi un tasto per uscire")
Console.Read()

End Sub

End Module

End Namespace

End Namespace

 

Il risultato del codice precedente è mostrato in figura:

Screenshot1

Sorgenti: C#  , VB.NET

Come evitare che il rendering di un elemento ecceda i bordi del proprio contenitore?

Scritto da Marco Amendola il 13 maggio 2010

In alcuni casi (per esempio utilizzando RenderTransform) è possibile che il rendering di un elemento ecceda i bordi del proprio contenitore. Per evitare questo comportamento è sufficiente impostare, nel contenitore, la proprietà ClipToBounds a True.
Così facendo, il rendering del controllo stesso (e dei sui figli) sarà contenuto nel rettangolo di layout, rendendo invisibili le parti eccedenti.

<Grid ClipToBounds="True">
<Label Background="WhiteSmoke">
<TextBlock TextWrapping="Wrap">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
</TextBlock>
</Label>
<Ellipse Width="50"
Height="50"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Fill="#8866aaff">
<Ellipse.RenderTransform>
<TranslateTransform X="-25" Y="-25" />
</Ellipse.RenderTransform>
</Ellipse>
</Grid>

Come determinare il nome del metodo in esecuzione?

Scritto da Antonio Pierascenzi il 11 maggio 2010
Linguaggio: C#,VB   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

Nei casi in cui sia necessario determinare il nome del metodo all'interno del quale si trova il codice in esecuzione è possibile utilizzare il metodo statico GetCurrentMethod() della classe MethodBase definita nel namespace System.Reflection.

C#

using System;
using System.Reflection;

namespace DomusDotNet
{
namespace Pillole
{
class Program
{
static void Main(string[] args)
{
MiaClasse miaClasse = new MiaClasse();
Console.WriteLine("MetodoStatico={0}", MiaClasse.MetodoStatico());
Console.WriteLine("MetodoIstanza={0}", miaClasse.MetodoIstanza());
Console.WriteLine("MetodoStaticoIterato={0}", MiaClasse.MetodoStaticoIterato());
Console.WriteLine("MetodoIstanzaIterato={0}", miaClasse.MetodoIstanzaIterato());
Console.WriteLine("Premi un tasto per uscire");
Console.Read();
}
}

public class MiaClasse
{
public static string MetodoStatico()
{
return MethodBase.GetCurrentMethod().Name;
}
public string MetodoIstanza()
{
return MethodBase.GetCurrentMethod().Name;
}
public static string MetodoStaticoIterato()
{
return string.Format("{0}+{1}", MetodoStatico(), MethodBase.GetCurrentMethod().Name);
}
public string MetodoIstanzaIterato()
{
return string.Format("{0}+{1}", MetodoIstanza(), MethodBase.GetCurrentMethod().Name);
}
}
}
}

VB.NET

Dim methodName As String = MethodBase.GetCurrentMethod().Name

Dato che il metodo GetCurrentMethod() restituisce un oggetto di classe MethodBase è possibile determinare non solo il nome ma anche le altre caratteristiche del metodo in esecuzione (gli attributi del metodo, la classe in cui è dichiarato, ecc.).

Come convertire una lista di float in una lista di int?

Scritto da Massimiliano Bellisario il 06 maggio 2010
Livello: 100 

Utilizzando il metodo generico ConvertAll della classe List<T> è possibile convertire una lista di float in una lista di int.

public void TestConversionFromFloatsToInts()
{
List<float> listFloats = new List<float>();
listFloats.Add(4f);
listFloats.Add(16.5f);
listFloats.Add(1f);
listFloats.Add(1.3f);
listFloats.Add(51f);
listFloats.Add(1f);
listFloats.Add(1.2f);
listFloats.Add(62f);
List<int> listints = listFloats.ConvertAll<int>(ConvertFloatToInt);
}

public static int ConvertFloatToInt(float x)
{
return Convert.ToInt32(x);
}
 

Come utilizzare la sessione in un handler Http?

Scritto da Massimo Bonanni il 04 maggio 2010
Livello: 100 

Se utilizziamo un handler Http (ashx), di base, non abbiamo a disposizione l'oggetto Session.

Per poterlo utilizzare è necessario che il nostro handler implementi una delle due interfacce:

  • IRequiresSessionState: per avere un completo controllo sull'oggetto Session;
  • IReadOnlySessionState : per accedere all'oggetto Session in sola lettura.

Come determinare se una proprietà è indicizzata?

Scritto da Giorgio Di Nardo il 29 aprile 2010
Linguaggio: C#,VB   • Framework: 1.1,2.0,3.0,3.5,4.0   • Livello: 100 

Nei casi in cui sia necessario determinare se una proprietà di una classe sia indicizzata è possibile utilizzare il metodo astratto GetIndexParameters() della classe PropertyInfo definita nel namespace System.Reflection.

Tale metodo, quando implementato nelle classi che derivano da PropertyInfo, restituisce un array di tutti i parametri di indice della proprietà. Se tale array è vuoto la proprietà non è indicizzata, in caso contrario è possibile esaminare gli oggetti di classe ParameterInfo contenuti nell'array per ricavarne informazioni sul numero e sul tipo dei parametri.

C#

class Program
{
static void Main(string[] args)
{
Type type = typeof(MiaClasse);
PropertyInfo propertyInfo;
ParameterInfo[] parametersInfo;

propertyInfo = type.GetProperty("NonIndicizzata");
parametersInfo = propertyInfo.GetIndexParameters();
Console.WriteLine("{0}.{1} ha {2} parametri.", type.Name, propertyInfo.Name, parametersInfo.Length);
foreach (ParameterInfo parameterInfo in parametersInfo)
Console.WriteLine(" {0}. {1} di tipo {2}", parameterInfo.Position, parameterInfo.Name, parameterInfo.ParameterType.Name);

propertyInfo = type.GetProperty("Item");
parametersInfo = propertyInfo.GetIndexParameters();
Console.WriteLine("{0}.{1} ha {2} parametri.", type.Name, propertyInfo.Name, parametersInfo.Length);
foreach (ParameterInfo parameterInfo in parametersInfo)
Console.WriteLine(" {0}. {1} di tipo {2}", parameterInfo.Position, parameterInfo.Name, parameterInfo.ParameterType.Name);

Console.Read();
}
}

class MiaClasse
{
public string NonIndicizzata { get; set; }

private List<string> _indicizzata = new List<string>();
public string this[int index]
{
get { return _indicizzata[index]; }
set { _indicizzata[index] = value; }
}
}

Come usare le espressioni per inserire il valore di una chiave del web.config in una pagina ASP.NET?

Scritto da Luca Cestola il 27 aprile 2010
Framework: 2.0,3.0,3.5,4.0   • Livello: 100 

Se abbiamo definito un valore nella sezione AppSettings del web.config, è possibile utilizzarlo in una pagina ASP.NET semplicemente usando un'apposita espressione direttamente nell'aspx tramite il tag server <%$ ... %>.

Supponiamo di aver inserito la seguente chiave nel web.config:

<configuration>
<appSettings>
<add key="TitoloApplicazione" value="MiaApplicazione">
</appSettings>
<configuration>

Possiamo quindi utilizzarne il valore nel seguente modo:

<asp:Label ID="LabelTitolo" runat="server" Text='<%$ AppSettings:TitoloApplicazione %>'/>

Come ottenere il primo elemento di una lista applicando un filtro?

Scritto da Alessandro Mostarda il 22 aprile 2010

Utilizzando l'extension method di Linq è possibile ottenere il primo elemento di una lista che corrisponde ad un determinato filtro.

C#

class Program
{
static void Main(string[] args)
{
List<MiaClasse> lista = new List<MiaClasse>()
{
new MiaClasse() { Nome = "Uno" },
new MiaClasse() { Nome = "Due" },
new MiaClasse() { Nome = "Tre" }
};
var due = lista.FirstOrDefault(item => item.Nome == "Due");
Console.WriteLine("Due={0}", due);
var quattro = lista.FirstOrDefault(item => item.Nome == "Quattro");
Console.WriteLine("Quattro={0}", quattro);
Console.Read();
}
}

class MiaClasse
{
public string Nome { get; set; }

public override string ToString()
{
return Nome;
}
}

VB.NET

Public Sub Main(ByVal args As String())
Dim lista = New List(Of MiaClasse)()
With lista
.Add(New MiaClasse With {.Nome = "Uno"})
.Add(New MiaClasse With {.Nome = "Due"})
.Add(New MiaClasse With {.Nome = "Tre"})
End With
Dim due = lista.FirstOrDefault(Function(item) item.Nome = "Due")
Console.WriteLine("Due={0}", due)
Dim quattro = lista.FirstOrDefault(Function(item) item.Nome = "Quattro")
Console.WriteLine("Quattro={0}", quattro)
Console.Read()
End Sub

Public Class MiaClasse

Private _Nome As String

Public Property Nome() As String
Get
Return Me._Nome
End Get
Set(ByVal value As String)
Me._Nome = value
End Set
End Property

Public Overrides Function ToString() As String
Return Me.Nome
End Function
End Class

Se inseriamo il codice precedente in una applicazione console otterremo il seguente risultato:

Result1

 
x